题解
线段树= =
代码如下:
#include<cstdio>
#include<string>
using namespace std;
const int maxn=200005;
int n,tt,tail;
long long las;
struct dyt{
int l,r,w;
}tree[4*maxn];
inline int read(){
int x=0; char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while (ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x;
}
void buildtree(int x,int l,int r){
tree[x].l=l; tree[x].r=r;
if (l==r) return;
int mid=(l+r)>>1;
buildtree(x*2,l,mid); buildtree(x*2+1,mid+1,r);
}
void put(int x,int l,int num){
if (tree[x].l==tree[x].r) {tree[x].w=num; return;}
int mid=(tree[x].l+tree[x].r)>>1;
if (l<=mid) put(x*2,l,num); else put(x*2+1,l,num);
tree[x].w=max(tree[x*2].w,tree[x*2+1].w);
}
int get(int x,int l,int r){
if (tree[x].l==l&&tree[x].r==r) return tree[x].w;
int mid=(tree[x].l+tree[x].r)>>1;
if (r<=mid) return get(x*2,l,r);
else if (l>mid) return get(x*2+1,l,r);
else return max(get(x*2,l,mid),get(x*2+1,mid+1,r));
}
int main(){
n=read(); tt=read();
buildtree(1,1,n);
for (int i=1;i<=n;i++) {
char ch=getchar(); while (ch!='Q'&&ch!='A') ch=getchar();
int x=read();
if (ch=='A') {
tail++; put(1,tail,(x+las)%tt);
} else {
las=get(1,tail-x+1,tail);
printf("%d\n",las);
}
}
return 0;
}