两种操作:
- Q L:查询当前数列中末尾L个数中的最大的数
- A n:将n加上t,其中t是最近一次查询操作的答案
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5, inf=0x3f3f3f3f;
ll m,mod,len,last,a[N<<2];
void add(int l, int r, ll v, int pos, int k) { //pos是插入位置
if (l==r) {
a[k]=v;
return;
}
int m=l+r>>1;
if (m>=pos) add(l,m,v,pos,k<<1);
else add(m+1,r,v,pos,k<<1|1);
a[k]=max(a[k<<1], a[k<<1|1]);
}
ll ask(int ql, int qr, int l, int r, int k) {
if (ql<=l && r<=qr)
return a[k];
ll m=l+r>>1, mx=-inf;
if (m>=ql) mx=max(mx, ask(ql,qr,l,m,k<<1));
if (m<qr) mx=max(mx, ask(ql,qr,m+1,r,k<<1|1));
return mx;
}
int main() {
std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin>>m>>mod;
for (int i=0; i<m; i++) {
char t; int n; cin>>t>>n;
if (t=='A') {
add(1,m,(last+n)%mod,++len,1);
} else {
if (n==0) last=0;
else last=ask(len-n+1,len,1,m,1);
cout<<last<<'
';
}
}
return 0;
}