本题用线段树即可AC主要是建树的时候有点难想,因为每次元素都放在最后所以我们可以每次插入时update一次。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <map>
#define MAXN 200005
using namespace std;
#define lson l, m ,rt<<1
#define rson m+1, r ,rt<<1|1
#define maxn 210000
int num[maxn*4];
int mod,n;
void pushup(int rt)
{
num[rt]=max(num[rt<<1],num[(rt<<1)|1]);
}
void update(int goal,int val,int l,int r,int rt)
{
if(l==r)
{
num[rt]=val;
return;
}
int m=(l+r)>>1;
if(m>=goal)
{
update(goal,val,lson);
}
else
{
update(goal,val,rson);
}
pushup(rt);
}
int query(int x,int y,int l,int r,int rt)
{
if(x<=l && r<=y )
{
return num[rt];
}
int tmp=0;
int m=(l+r)>>1;
if(x<=m)
{
tmp=max(tmp,query(x,y,lson));
}
if(y>m)
{
tmp=max(tmp,query(x,y,rson));
}
return tmp;
}
int main()
{
scanf("%d%d",&n,&mod);
char st[10];
int tmp=n;
int len=0;
int x,last=0;
for(int i=1;i<=tmp;i++)
{
scanf("%s%d",st,&x);
if(st[0]=='A')
{
len=len+1;
update(len,(x+last)%mod,1,n,1);
}
else
{
last=query(len-x+1,len,1,n,1);
printf("%d\n",last);
}
}
return 0;
}