用两个栈对光标的操作进行维护即可。
//time:718ms
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
const int N=1000010;
int sum[N],ans[N];
int cur;
stack<int> s1,s2;
void init()
{
while(!s1.empty()) s1.pop();
while(!s2.empty()) s2.pop();
sum[0]=0;
cur=0;
ans[0]=-0x3f3f3f3f;
}
int main()
{
ios::sync_with_stdio(false);
int Q,t;
char ch[2];
while(scanf("%d",&Q)==1) {
init();
while(Q--) {
scanf("%s",ch);
switch(ch[0]){
case 'I':
scanf("%d",&t);
s1.push(t);
++cur;
sum[cur]=sum[cur-1]+t;
ans[cur]=max(sum[cur],ans[cur-1]);
break;
case 'D':
if(!s1.empty()) {
--cur;
s1.pop();
}
break;
case 'L':
if(!s1.empty()) {
--cur;
s2.push(s1.top());
s1.pop();
}
break;
case 'R':
if(!s2.empty()) {
++cur;
s1.push(s2.top());
s2.pop();
sum[cur]=sum[cur-1]+s1.top();
ans[cur]=max(sum[cur],ans[cur-1]);
}
break;
case 'Q':
scanf("%d",&t);
printf("%d\n",ans[t]);
}
}
}
}