一开始
想用线段树来着
后来说
不用线段树也能做
因为这是个从末尾往前的查询
其实只要
维护一个递减的单调栈就可以了
但是还是要保留
原本输入的序号
查询的时候
根据序号来确定
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
int m,i,n,t,b[200000+5],a[200000+5],p,k;
char ur;
long long d;
int search(int l,int r,int aim)
{
int mid=(l+r)>>1;
while(l!=r)
{
if(b[mid]>aim) r=mid;
if(b[mid]==aim) return mid;
if(b[mid]<aim) l=mid+1;
mid=(l+r)>>1;
}
return mid;
}
int main()
{
scanf("%d%lld",&m,&d);
for(i=1;i<=m;i++)
{
cin>>ur;
scanf("%d",&n);
if(ur=='Q')
{
t=a[b[search(1,p,k-n+1)]];
printf("%d\n",t);
}
if(ur=='A')
{
n=(n+t)%d;
k++;
a[k]=n;
while(b[p]>0&&n>a[b[p]]) p--;
p++;
b[p]=k;
}
}
return 0;
}