线段树提前开20w个点建树就可以直接修改。
#include<iostream>
#include<cstdio>
#define LL long long
using namespace std;
struct xds
{
int l,r;
LL ma;
}tree[800005];
void build(int dq,int l,int r)
{
tree[dq].l=l;
tree[dq].r=r;
if(l==r)
return ;
int mid=(l+r)>>1;
build(dq<<1,l,mid);
build(dq<<1|1,mid+1,r);
}
LL ask(int dq,int l,int r)
{
if(tree[dq].l>=l&&tree[dq].r<=r)
return tree[dq].ma;
LL ans=0;
int mid=(tree[dq].l+tree[dq].r)>>1;
if(mid>=l)
ans=max(ans,ask(dq<<1,l,r));
if(mid<r)
ans=max(ans,ask(dq<<1|1,l,r));
return ans;
}
void up(int dq)
{
tree[dq].ma=max(tree[dq<<1].ma,tree[dq<<1|1].ma);
}
void change(int dq,int c,LL v)
{
if(tree[dq].l==tree[dq].r)
{
tree[dq].ma=v;
return ;
}
int mid=(tree[dq].r+tree[dq].l)>>1;
if(mid>=c)
change(dq<<1,c,v);
else
change(dq<<1|1,c,v);
up(dq);
}
int main()
{
int m;LL d,n,t=0;int tot=0;
char a;int x;
scanf("%d%lld",&m,&d);
build(1,1,m);
for(int i=1;i<=m;i++)
{
a=getchar();
while(a!='A'&&a!='Q')
a=getchar();
if(a=='Q')
{
scanf("%d",&x);
t=ask(1,tot-x+1,tot);
printf("%d\n",t);
}
else
{
scanf("%lld",&n);
n+=t;n%=d;
tot++;
change(1,tot,n);
}
}
return 0;
}