【洛谷P1198】最大数

题目大意:在线维护一个序列,支持插入一个数,查询区间最值。

题解:直接建立线段树,插入就单点修改,查询就正常查。。orz开始还真没想到。。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
const int inf=0x3f3f3f3f;

struct node{
	#define ls(x) t[x].lc
	#define rs(x) t[x].rc
	int lc,rc,mx;
}t[maxn<<1];
int tot,root;
inline void pushup(int o){t[o].mx=max(t[ls(o)].mx,t[rs(o)].mx);}
int build(int l,int r){
	int o=++tot;
	if(l==r){t[o].mx=-inf;return o;}
	int mid=l+r>>1;
	ls(o)=build(l,mid),rs(o)=build(mid+1,r);
	return pushup(o),o;
}
void modify(int o,int l,int r,int pos,int val){
	if(l==r){t[o].mx=val;return;}
	int mid=l+r>>1;
	if(pos<=mid)modify(ls(o),l,mid,pos,val);
	else modify(rs(o),mid+1,r,pos,val);
	pushup(o);
}
int query(int o,int l,int r,int x,int y){
	if(l==x&&r==y)return t[o].mx;
	int mid=l+r>>1;
	if(y<=mid)return query(ls(o),l,mid,x,y);
	else if(x>mid)return query(rs(o),mid+1,r,x,y);
	else return max(query(ls(o),l,mid,x,mid),query(rs(o),mid+1,r,mid+1,y));
}

int q,mod,val,lastans,cnt;
char s[4];

int main(){
	scanf("%d%d",&q,&mod);
	root=build(1,2e5);
	while(q--){
		scanf("%s%d",s,&val);
		if(s[0]=='Q')printf("%d\n",lastans=query(root,1,2e5,cnt-val+1,cnt));
		else{
			val=(val+lastans)%mod,++cnt;
			modify(root,1,2e5,cnt,val);
		}
	}
	return 0;
}
posted @ 2019-03-19 17:15  shellpicker  阅读(128)  评论(0编辑  收藏  举报