题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=1012
题解:
很久没怎么写线段树了,一个小错误错了半天。唉!
代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
const int maxn = 2e5+10;
int tree[1<<19];
void push_up(int root)
{
tree[root]=max(tree[root<<1],tree[root<<1|1]);
}
void build(int root,int l,int r)
{
if(l==r)
{
tree[root]=0;
return;
}
int mid=(l+r)>>1;
build(root<<1,l,mid);
build(root<<1|1,mid+1,r);
}
void updata(int pos,int delta,int root,int l,int r)
{
if(l==r)
{
tree[root]=delta;
return;
}
int mid=(l+r)>>1;
if(pos<=mid)
updata(pos,delta,root<<1,l,mid);
if(pos>mid)
updata(pos,delta,root<<1|1,mid+1,r);
push_up(root);
}
int query(int L,int R,int root,int l,int r)
{
if(L<=l&&r<=R)
return tree[root];
int mid=(l+r)>>1;
int res=0;
if(L<=mid)
res=max(res,query(L,R,root<<1,l,mid));
if(R>mid)
res=max(res,query(L,R,root<<1|1,mid+1,r));
return res;
}
int main()
{
int n,mod;
scanf("%d%d",&n,&mod);
build(1,1,n);
int pos=0;
char s[10];
int MAX=0;
for(int i=0;i<n;i++)
{
scanf("%s",s);
if(s[0]=='A')
{
int num;
scanf("%d",&num);
pos++;
updata(pos,(MAX+num)%mod,1,1,n);
}
else
{
int left;
scanf("%d",&left);
MAX=query(pos-left+1,pos,1,1,n);
printf("%d\n",MAX);
}
}
}