最後一個點wa
//單點修改,區間查詢
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
long long m,D;
struct TRE{
int l,r;
long long mx;
}tre[800005];//***
void pushup(int rt)
{
tre[rt].mx=max(tre[rt<<1].mx,tre[rt<<1|1].mx);
}
void build(int rt,int L,int R)
{
if(L==R){
tre[rt].mx=0;
tre[rt].l=L;
tre[rt].r=R;
return ;
}
tre[rt].l=L;
tre[rt].r=R;
int mid=(L+R)>>1;
build(rt<<1,L,mid);
build(rt<<1|1,mid+1,R);
pushup(rt);
}
void update(int rt,int ps,int c)
{
if(tre[rt].l==tre[rt].r)
{
tre[rt].mx+=c;
return;
}
int mid=(tre[rt].l+tre[rt].r)>>1;
if(ps<=mid)
update(rt<<1,ps,c);
else
update(rt<<1|1,ps,c);
pushup(rt);
}
long long query(int rt,int L,int R)
{
if(L<=tre[rt].l && R>=tre[rt].r)
{
return tre[rt].mx;
}
int mid=(tre[rt].l+tre[rt].r)>>1;
long long rst=-1e18;
if(L<=mid) rst=max(rst,query(rt<<1,L,R));
if(R>=mid+1) rst=max(rst,query(rt<<1|1,L,R));
return rst;
}
int main()
{
scanf("%d%d",&m,&D);
build(1,1,m);
long long t=0,n=0;int pos=0;
char q;
for(int i=1;i<=m;i++)
{
scanf(" %c%d",&q,&n);
if(q=='A')
{
update(1,++pos,(t+n)%D);//負數模一個正數的餘數
}
else
{
t=query(1,pos-n+1,m);//查詢mn-n+1到m的最大值
cout<<t<<endl;
}
}
}