简化的线段树版本
注意负数的存在 先memset一下
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 220000
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
ll MOD,n,m,ans[MAXN<<2];
inline void push_up(ll p)
{
ans[p]=max(ans[ls(p)],ans[rs(p)]);//向上传递结果
}
inline void update(ll nl,ll nr,ll l,ll r,ll p,ll k)
{
if(nl==l&&r==nr)//叶子节点
{
ans[p]=k;
return;
}
ll mid=(l+r)>>1;
if(nl<=mid)update(nl,nr,l,mid,ls(p),k);
if(nr>mid) update(nl,nr,mid+1,r,rs(p),k);
push_up(p);
}
inline ll query(ll q_x,ll q_y,ll l,ll r,ll p)
{
ll mid=(l+r)>>1;
if(q_x<=l&&r<=q_y){
return ans[p];
}
ll res=-1<<26;
if(q_x<=mid) res=max(res,query(q_x,q_y,l,mid,ls(p)));
if(q_y>mid) res=max(res,query(q_x,q_y,mid+1,r,rs(p)));
return res;
}
int main(){
int M;
cin>>M>>MOD;
ll t=0;
memset(ans,128,sizeof(ans));//考虑负数的存在赋值成一个较小的数
ll len=0;
for(int i=1;i<=M;i++){
char ch;
ll num;
cin>>ch>>num;
if(ch=='A'){
len++;
update(len,len,1,MOD,1,(num+t)%MOD);
}
else{
if(num){
t=query(len-num+1,len,1,MOD,1);
cout<<t<<endl;
}
else{
cout<<0<<endl;
t=0;
}
}
}
return 0;
}