这个就是线段树模板
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int mod;
const int N=200000+5;
struct node{
int l,r;
int v=0;
int id;
}tree[N<<4];
int a[N];
void build(int flag,int l,int r)
{
if(l==r){
tree[flag].l=tree[flag].r=l;
return ;
}
int mid=(l+r)/2;
tree[flag].l=l;
tree[flag].r=r;
build(flag*2,l,mid);
build(flag*2+1,mid+1,r);
}
int ask(int flag,int l,int r)
{
if(tree[flag].l>=l&&tree[flag].r<=r){
//cout<<"ask="<<tree[flag].v;
return tree[flag].v;
}
int left=-999999,right=-999999;
if(l<=tree[flag*2].r){
left=ask(flag*2,l,r);
}
if(r>=tree[flag*2+1].l){
right=ask(flag*2+1,l,r);
}
tree[flag].v=max(max(left,right),tree[flag].v);
return max(left,right);
}
int add(int flag,int dig,int num)
{
if(tree[flag].l==tree[flag].r){
tree[flag].v=num;
return num;
}
int l=-999999;
if(dig<=tree[flag*2].r){
l=add(flag*2,dig,num);
}
else
l=add(flag*2+1,dig,num);
tree[flag].v=max(l,tree[flag].v);
}
int main()
{
int m;
scanf("%d",&m);
scanf("%d",&mod);
build(1,1,N-5);
ll last=0;
int n=0;
while(m--)
{
char ch;
cin>>ch;
int num;
scanf("%d",&num);
if(ch=='A'){
n++;
add(1,n,(last+num)%mod);
//cout<<tree[1].v<<"sdfsd"<<endl;
}else{
last=ask(1,n-num+1,n);
printf("%d\n",last);
//cout<<tree[1].v<<"sdfsd"<<endl;
}
}
return 0;
}