本来想水一道绿的,结果线段树调了一个小时还是0分,感觉自己太唐了。记录。
急了啊所以求助大神QAQ
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void rd(int &p){
p=0;int f(0);char z=getchar();
while(z>'9'||z<'0'){if(z=='-')f^=1;z=getchar();}
while(z>='0'&&z<='9')p=(p<<1)+(p<<3)+z-'0',z=getchar();
if(f)p=-p;
}
void rdl(ll &p){
p=0;int f(0);char z=getchar();
while(z>'9'||z<'0'){if(z=='-')f^=1;z=getchar();}
while(z>='0'&&z<='9')p=(p<<1)+(p<<3)+z-'0',z=getchar();
if(f)p=-p;
}
const int N=1e6+50;
int T,n(0),a[N],ans(0),mod;
struct hhoppitree{
int l,r,val;
void cl(int L,int R){
l=L,r=R,val=-2e9-7;
}
}t[N];
void build(int l,int r,int p){
t[p].cl(l,r);
if(l==r)return;
int mid=l+r>>1;
build(l,mid,p<<1);build(mid+1,r,p<<1|1);
}
void up(int p){
t[p].val=max(t[p<<1].val,t[p<<1|1].val);
}
void add(int x,int z,int p){
if(t[p].l==t[p].r){
t[p].val=z;return;
}int mid=t[p].l+t[p].r>>1;
if(x<=mid)add(x,z,p<<1);
else add(x,z,p<<1|1);
up(p);
}
int ask(int l,int r,int p){
if(t[p].l>=l&&t[p].r<=r)return t[p].val;
int mid=t[p].l+t[p].r>>1,e(-2e9);
if(l<=mid)e=ask(l,r,p<<1);
if(r>mid)e=max(e,ask(l,r,p<<1|1));
return e;
}
int main(){
rd(T);rd(mod);
char op;int x;
build(1,T,1);
while(T--){
scanf("%c",&op);rd(x);
if(op=='A'){
//x=(x%mod+mod)%mod;
x=1ll*(x+ans)%mod;a[++n]=x;
add(n,x,1);
}
else{
printf("%d\n",ans=ask(n-x+1,n,1));
}
}
return 0;
}