1. 程式人生 > 其它 >P1531 I Hate It 線段樹解法

P1531 I Hate It 線段樹解法

P1531 I Hate It
區間最大值,區間查詢最大值,單點更新

//P1531 I Hate It
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=222222;
int Max[maxn<<2];
void PushUp(int rt)
{
	Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);
}
void build(int l,int r,int rt)
{
	if (l==r)
	{
		cin>>Max[rt];
		return ;
	}
	int m=(l+r)>>1;
	build(lson);
	build(rson);
	PushUp(rt);
}
void update(int p,int sc,int l,int r,int rt)
{
	if (l==r)
	{
		if (Max[rt]<sc)
		{
			Max[rt]=sc;
		}
		return ;
	}
	int m=(l+r)>>1;
	if (p<=m) update(p,sc,lson);
	else update(p,sc,rson);
	PushUp(rt);
}
int query(int L,int R,int l,int r,int rt)
{
	if (L<=l&&r<=R)
	{
		return Max[rt];
	}
	int m=(l+r)>>1;
	int ret=0;
	if (L<=m) ret=max(ret,query(L,R,lson));
	if (R>m) ret=max(ret,query(L,R,rson));
	return ret;
}
int main()
{
	int n,m;
	cin>>n>>m;
	build(1,n,1);
	for (int i=1;i<=m;i++)
	{
		char c;
		int x,y;
		cin>>c>>x>>y;
		if (c=='Q')
		{
			cout<<query(x,y,1,n,1)<<endl;
		}
		else
		{
			update(x,y,1,n,1);
		}
	}
}