#include<iostream>
#include<cstdio>
using namespace std;
int const maxn=200001;
int n,m,p,a[maxn];
struct data{int l,r,val;}tr[4*maxn];
void build(int k,int s,int t){//建树
tr[k].l=s;tr[k].r=t;
if(s==t) return;
int mid=(s+t)>>1;
build(k<<1,s,mid);
build(k<<1|1,mid+1,t);
}
void add(int k,int x,int addval){//单点修改
tr[k].val=max(tr[k].val,addval);
int ll=tr[k].l,rr=tr[k].r;
if(ll==rr) return;
int mid=(ll+rr)>>1;
if(x<=mid) add(k<<1,x,addval);
else add(k<<1|1,x,addval);
}
int query(int k,int x,int y){//区间最大值
int ll=tr[k].l,rr=tr[k].r;
if(x==ll && y==rr) return tr[k].val;
int mid=(ll+rr)>>1;
if(y<=mid) return query(k<<1,x,y);
else if(x>mid) return query(k<<1|1,x,y);
else return max(query(k<<1,x,mid),query(k<<1|1,mid+1,y));
}
int main(){
scanf("%d%d",&n,&p);
build(1,1,n);
int k=0;
for(int i=1;i<=n;i++){
char ch;int x;
cin>>ch;
scanf("%d",&x);
if(ch=='A') {
m++;
add(1,m,(x%p+k%p)%p);
}
else{
k=query(1,m-x+1,m);
printf("%d\n",k);
}
}
}
【线段树】Laoj1299
最新推荐文章于 2021-02-08 12:12:46 发布