题目:最大数
思路:线段树。最开始就建一个m个点的线段树,这样对数列增加的操作就变成线段树的单点修改了。
注意:在L=0时,要输出0,所以不可以把线段树的值初始化成-inf。另外注意边界,不然会MLE。建议在BZOJ过了的也在LUOGU交一下,这题BZOJ的数据比较水一点。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 200000
int n,md;
int t=0,p;
int a[maxn*4+5];
int m=0;
void update(int o,int l,int r) {
if(m<l||m>r) return ;
if(l==r) {
a[o]=p;
return;
}
int mid=l+(r-l)/2;
int lc=o*2,rc=o*2+1;
update(lc,l,mid),update(rc,mid+1,r);
a[o]=max(a[lc],a[rc]);
}
int query(int o,int l,int r) {
if(p<=l&&m>=r) return a[o];
if(m<l||p>r) return 0;
int mid=l+(r-l)/2;
int lc=o*2,rc=o*2+1;
return max(query(lc,l,mid),query(rc,mid+1,r));
}
int main() {
scanf("%d%d",&n,&md);
for(int i=1; i<=n; i++) {
char x;
while(~scanf("%c",&x)&&!isalpha(x));
scanf("%d",&p);
if(x=='A') {
p=(p+t)%md;
++m;
update(1,1,n);
}
if(x=='Q') {
if(m==0) printf("0\n");
else p=m-p+1,printf("%d\n",t=query(1,1,n));
}
}
return 0;
}