洛谷 P1198 最大数

传送门:洛谷 P1198 最大数
算法分析:单点修改,区间查询最大值,与加法有略微不同,也不必使用懒标记,模板即可


#include<iostream>
#include<cstdio>
#define maxN 200010
#define ls k<<1
#define rs k<<1 | 1
#define mid ((l+r)>>1)
using namespace std;
typedef long long ll;
ll sum[maxN*4+1],D,t;
int m,x,tot=0; char op[3];
void pushup(int);
ll query(int,int,int,int,int);
void update(int,int,int,int,int);
int main()
{
	scanf("%d %lld\n",&m,&D);
	for(int i=1;i<=m;i++)
	{
		scanf("%s %d\n",op,&x);
		if(op[0]=='A')
		{
			update(1,1,m,tot+1,(x+t)%D);
			tot++;
		}
		else
		{
			t=query(1,1,m,tot-x+1,tot)%D;
			printf("%lld\n",t);
		}
	}
	return 0;
}
void pushup(int k) {sum[k]=max(sum[ls],sum[rs]);}
void update(int k,int l,int r,int pos,int u)
{
	if(l==r) {sum[k]=u; return;}
	if(pos<=mid) update(ls,l,mid,pos,u);
	if(pos>mid) update(rs,mid+1,r,pos,u);
	pushup(k);
}
ll query(int k,int l,int r,int ql,int qr)
{
	if(ql<=l && r<=qr) return sum[k];
	long long ans=0;
	if(ql<=mid) ans=query(ls,l,mid,ql,qr);
	if(qr>mid) ans=max(ans,query(rs,mid+1,r,ql,qr));
	return ans;
}
posted @ 2019-02-10 10:57  常青藤的花语  阅读(187)  评论(0编辑  收藏  举报

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。