树状数组,把题目中说的加到最后的数加到前面,这样就可以直接做了。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
using namespace std;
long long a[200005];
long long m, d;
int it;
int lowbit(int x)
{
return x&-x;
}
long long query(int L)
{
int to=it-1+L;
long long ret=0;
while(to>=it)
{
ret=max(ret,a[to]);
to-=lowbit(to);
}
return ret;
}
void upd(int st,long long va)
{
while(st<=m)
{
a[st]=max(a[st],va);
st+=lowbit(st);
}
}
int main()
{
int i, j;
char op[3];
long long pre, n, t;
while(~scanf("%lld%lld",&m,&d)){
for(i=1;i<=m;i++)
a[i]=0;
it=m+1;
pre=0;
t=0;
for(i=1;i<=m;i++){
scanf("%s%lld",op,&n);
if(op[0]=='Q'){
t=query(n);
printf("%lld\n",t);
}else{
a[--it]=(n+t)%d;
upd(it,a[it]);
}
}
}
return 0;
}