传送门:https://www.luogu.org/problemnew/show/P1198
一道变式树状数组
区别是从末尾开始建点
其他操作没有变
差不多就是这样,,很水的一道题
上代码
#include<bits/stdc++.h>
#define in read()
using namespace std;
int in{
int cnt=0,f=1;char ch=0;
while(!isdigit(ch)){
ch=getchar();
if(ch=='-')f=-1;
}
while(isdigit(ch)){
cnt=cnt*10+ch-48;
ch=getchar();
}
return cnt*f;
}
int cnt;
int d[200003];
int n,p;int last;
int lowbit(int x){
return x&(-x);
}
void update(int x,int k){
while(x<=200000){
d[x]=max(d[x],k);
x+=lowbit(x);
}
}
int query(int x){
int ans=-1;
while(x!=0){
ans=max(ans,d[x]);
x-=lowbit(x);
}
return ans;
}
int main(){
n=in;p=in;
char c;int x;int pos=200000;
while(n--){
cin>>c;x=in;
if(c=='A'){
update(pos,(x+last)%p);
pos--;
}
else{
int y=pos+x;
printf("%d\n",query(y));
last=query(y);
}
}
return 0;
}
一定小心边界问题,,包括该不该+-1都需要考虑一下,,虽然这道题不需要ovo