题解:
建立两个栈,都以光标所在的那一端作为栈顶。
//#include<bits/stdc++.h>
#include<algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define P(a,b,c) make_pair(a,make_pair(b,c))
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define CLR(vis) memset(vis,0,sizeof(vis))
#define MST(vis,pos) memset(vis,pos,sizeof(vis))
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef pair<int,pair<int,int> >pii;
typedef long long ll;
const ll mod = 1000000007;
const int INF = 0x3f3f3f3f;
ll gcd(ll a, ll b) {
return b ? gcd(b, a%b) : a;
}
const int maxn=1e6+5;
int A[maxn],B[maxn];
int f[maxn],sum[maxn];
char t[10];
int n,num;
int main() {
while(~scanf("%d", &n)) {
f[0]=-INF;
sum[0]=0;
int cnt_A=0;
int cnt_B=0;
while(n--) {
scanf("%s", t);
if(t[0]=='I') {
scanf("%d", &A[++cnt_A]);
sum[cnt_A]=sum[cnt_A-1]+A[cnt_A];
f[cnt_A]=max(f[cnt_A-1],sum[cnt_A]);
}
if(t[0]=='D'&&cnt_A!=0) {
cnt_A--;
}
if(t[0]=='L'&&cnt_A!=0) {
B[++cnt_B]=A[cnt_A--];
}
if(t[0]=='R'&&cnt_B!=0) {
A[++cnt_A]=B[cnt_B--];
sum[cnt_A]=sum[cnt_A-1]+A[cnt_A];
f[cnt_A]=max(f[cnt_A-1],sum[cnt_A]);
}
if(t[0]=='Q') {
scanf("%d", &num);
printf("%d\n", f[num]);
}
}
}
return 0;
}