点击这里查看原题
线段树做法
/*
User:Small
Language:C++
Problem No.:1012
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
#define lson (rt<<1)
#define rson (lson|1)
#define mid (l+r>>1)
using namespace std;
const int M=2e5+5;
int n,D,mx[M<<2],res,tot;
void add(int rt,int l,int r,int x,int k){
if(l==r){
mx[rt]=k;
return;
}
if(x<=mid) add(lson,l,mid,x,k);
else add(rson,mid+1,r,x,k);
mx[rt]=max(mx[lson],mx[rson]);
}
int query(int rt,int l,int r,int L,int R){
if(L<=l&&r<=R) return mx[rt];
int res=0;
if(mid>=L) res=max(res,query(lson,l,mid,L,R));
if(mid<R) res=max(res,query(rson,mid+1,r,L,R));
return res;
}
int main(){
freopen("data.in","r",stdin);//
scanf("%d%d",&n,&D);
for(int i=1;i<=n;i++){
char op[5];
int tmp;
scanf("%s%d",op,&tmp);
if(op[0]=='A')
add(1,1,n,++tot,(tmp+res)%D);
else{
res=query(1,1,n,tot-tmp+1,tot);
printf("%d\n",res);
}
}
return 0;
}
单调栈做法
/*
User:Small
Language:C++
Problem No.:1012
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
const int M=2e5+5;
int n,num[M],d,ans,tot,s[M],tp;
int main(){
freopen("data.in","r",stdin);//
scanf("%d%d",&n,&d);
while(n--){
char op[5];
int x;
scanf("%s%d",op,&x);
if(op[0]=='Q'){
ans=num[s[lower_bound(s+1,s+tp+1,tot-x+1)-s]];
printf("%d\n",ans);
}
else{
num[++tot]=(ans+x)%d;
while(tp&&num[s[tp]]<=num[tot]) tp--;
s[++tp]=tot;
}
}
return 0;
}