#include <iostream>
#include <cstring>
#include <cmath>
#define int long long
using namespace std;
namespace quickread{
inline int read(){
int x=0;bool f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
inline void write(int x){
if(x<0){putchar('-');x=-x;}
if(x>9)write(x/10);
putchar(x%10+'0');
}
inline char readchar(){
char ch=getchar();
while(ch!='A'&&ch!='Q') ch=getchar();
return ch;
}
}
using namespace quickread;
const int N=5e6+10;
int n,m,q,len;
int mod,t,a[N],st[N],ed[N],pos[N],val[N];
void build(){
memset(a,-0x3f,sizeof(a));
memset(val,-0x3f,sizeof(val));
len=1e3;
m=q/len;
if(m*len!=q) m++;
for(int i=1;i<=m;i++){
st[i]=ed[i-1]+1;
ed[i]=ed[i-1]+len;
for(int j=st[i];j<=ed[i];j++) pos[j]=i;
}
ed[m]=q;
}
void update(int k){
k%=mod;
while(k<0) k+=mod;
a[++n]=k;
val[pos[n]]=max(val[pos[n]],k);
}
int query(int l,int r){
int lt=pos[l],rt=pos[r];
int ans=-0x3f3f3f3f3f3f3f3f;
if(lt==rt){
for(int i=l;i<=r;i++) ans=max(ans,a[i]);
}else{
for(int i=lt+1;i<=rt-1;i++) ans=max(ans,val[i]);
for(int i=st[rt];i<=r;i++) ans=max(ans,a[i]);
for(int i=l;i<=ed[lt];i++) ans=max(ans,a[i]);
}
return t=ans;
}
signed main(){
q=read(),mod=read();
build();
while(q--){
char opt=readchar();
int x=read();
if(opt=='A')
update(x+t),t=0;
else
write(query(n-x+1,n)),putchar('\n');
}
return 0;
}
虽然前面还发过一个求助帖,但代码不一样