分块解法
#include<iostream>
#include<cmath>
using namespace std;
const int N=200010;
int p;
int len,num,l[500],r[500],pos[N],maxs[500],a[N];
void modify(int x,int v)
{
a[x]=v;
int res=-1;
for(int i=l[pos[x]];i<=r[pos[x]];i++)
{
res=max(res,a[i]);
}
maxs[pos[x]]=res;
}
int query(int x,int y)
{
if(pos[x]==pos[y]||pos[y]-pos[x]==1)
{
int res=-1;
for(int i=x;i<=y;i++)res=max(res,a[i]);
return res;
}
else
{
int res=-1;
for(int i=pos[x]+1;i<=pos[y]-1;i++)res=max(res,maxs[i]);
for(int i=x;i<=r[pos[x]];i++)res=max(res,a[i]);
for(int i=l[pos[y]];i<=y;i++)res=max(res,a[i]);
return res;
}
}
int main()
{
int m;
cin>>m>>p;
len=sqrt(m);
num=ceil(1.0*m/len);
for(int i=1;i<=num;i++)l[i]=(i-1)*len+1,r[i]=i*len;
for(int i=1;i<=m;i++)pos[i]=(i-1)/len+1;
int ed=0,last;
while(m--)
{
string s;
cin>>s;
if(s=="Q")
{
int k;
cin>>k;
last=query(ed-k+1,ed);
cout<<last<<endl;
}
else
{
int x;
cin>>x;
ed++;
modify(ed,(1ll*x+last)%p);
}
}
return 0;
}