样例过了,但全 WA 了
//By: Luogu@wangdemao(308854)
#include <iostream>
#include <cstring>
#define ull unsigned long long
#define int long long
using namespace std;
const int INF=0x3f3f3f3f;
struct Node
{
int Min=0,Max=0;
};
Node a[5000000];
int n,d;
int h[5000000];
inline int lc(int u)
{
return u<<1;
}
inline int rc(int u)
{
return (u<<1)+1;
}
void PushUp(int u)
{
a[u].Max=max(a[lc(u)].Max,a[rc(u)].Max)%d;
}
void MakeTree(int u,int l,int r)
{
if(l==r)
{
a[u].Max=h[l];
return ;
}
int mid=(l+r)/2;
MakeTree(lc(u),l,mid);
MakeTree(rc(u),mid+1,r);
PushUp(u);
return ;
}
void AddPoint(int u,int l,int r,int val)
{
if(l==r)
{
a[u].Max=val;
return ;
}
int mid=(l+r)/2;
//
if(a[lc(u)].Max==0)
{
AddPoint(lc(u),l,mid,a[u].Max);
AddPoint(rc(u),mid+1,r,val);
a[u].Max=max(a[lc(u)].Max,a[rc(u)].Max);
}
else
{
a[u].Max=max(a[u].Max,val);
AddPoint(rc(u),mid+1,r,val);
}
}
int QueryMax(int u,int l,int r,int ql,int qr)
{
if(ql<=l && r<=qr)
{
return a[u].Max%d;
}
int ans=-0;
int mid=(l+r)/2;
if(ql<=mid)
{
ans=max(ans,QueryMax(lc(u),l,mid,ql,qr))%d;
}
if(qr>mid)
{
ans=max(ans,QueryMax(rc(u),mid+1,r,ql,qr))%d;
}
return ans;
}
signed main()
{
int m,lastt=0,cnt=0;
cin>>m>>d;
while(m--)
{
char x;
cin>>x;
if(x=='A')
{
//memset(a,0,sizeof(a));
int n;
cin>>n;
h[++cnt]=(n%d+lastt%d)%d;
AddPoint(1,1,cnt,h[cnt]);
//cout<<a[1].Max<<endl;
}
if(x=='Q')
{
int L;
cin>>L;
// for(int i=1;i<=3;i++)
// cout<<a[i].Max<<" ";
// cout<<endl;
lastt=QueryMax(1,1,cnt,cnt-L+1,cnt)%d;
cout<<lastt%d<<endl;
}
}
return 0;
}