线段树的题目
Time | 1152ms |
---|---|
Memory | 10196kB |
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 2e5;
const int inf = 0x3f3f3f3f;
struct node
{
int l, r, maxx;
} tree[maxn*4];
void build(int k,int l,int r)
{
if(l == r){
tree[k].l = l;
tree[k].r = r;
tree[k].maxx = -inf;
return ;
}
tree[k].l = l;
tree[k].r = r;
tree[k].maxx = -inf;
build(k<<1,l,(l+r)>>1);
build(k<<1|1,((l+r)>>1)+1,r);
}
void update(int k,int p,int val)
{
if(tree[k].l > p || tree[k].r < p) return ;
if(tree[k].l == tree[k].r && tree[k].l == p){
tree[k].maxx = val;
return ;
}
update(k<<1,p,val);
update(k<<1|1,p,val);
tree[k].maxx = max(tree[k<<1].maxx,tree[k<<1|1].maxx);
}
int query(int k,int l,int r)
{
if(tree[k].l > r || tree[k].r < l) return -inf;
if(tree[k].l >= l && tree[k].r <= r) return tree[k].maxx;
int res = -inf;
res = max(res,query(k<<1,l,r));
res = max(res,query(k<<1|1,l,r));
return res;
}
int main()
{
int n, m; scanf("%d %d",&n,&m);
build(1,1,n);
char op;
int x, cnt = 0, tmp = 0;
for(int i = 1; i <= n; i++){
getchar();
scanf("%c %d",&op,&x);
if(op == 'A'){
++cnt;
update(1,cnt,(tmp+x)%m);
}
else{
tmp = query(1,cnt-x+1,cnt);
printf("%d\n",tmp);
}
}
return 0;
}