题目链接:BZOJ 1012
这道题是裸线段树,但也有神犇用单调队列+二分乱搞搞出来了。。。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define maxn (200000+5)
int M,D,N=0;
int T[maxn*4];
void update(int x){
T[x]=max(T[x<<1],T[x<<1|1]);
}
void built(int x,int l,int r,int pos,int val){
if(l==r){
T[x]=val; return ;
}
int mid=(l+r)>>1;
if(pos<=mid)built(x<<1,l,mid,pos,val);
else built(x<<1|1,mid+1,r,pos,val);
update(x);
}
int query(int x,int l,int r,int L,int R){
if(L<=l&&r<=R)return T[x];
int mid=(l+r)>>1,ret=0;
if(L<=mid)ret=max(ret,query(x<<1,l,mid,L,R));
if(R>mid)ret=max(ret,query(x<<1|1,mid+1,r,L,R));
return ret;
}
int main(){
scanf("%d%d",&M,&D);
int t=0,y,hz=M; char x;
while(hz--){
scanf("\n");
scanf("%c%d",&x,&y);
if(x=='A'){
N++;
built(1,1,M,N,(t+y)%D);
}
else printf("%d\n",t=query(1,1,M,N-y+1,N));
}
return 0;
}