B-I Hate It(セグメントツリー)


多くの学校では比較的な習慣が流行している.先生たちは聞くのが好きで、○○から○○までの中で、点数が一番高いのはいくらですか.これは多くの学生に反感を抱かせた.あなたが喜ぶかどうかにかかわらず、今あなたがしなければならないのは、先生の要求に従って、プログラムを書いて、先生の質問をシミュレートすることです.もちろん、先生はある同級生の成績を更新する必要があることがあります.
Input
この問題には複数のテストが含まれています.ファイルが終わるまで処理してください.各試験の1行目には、2つの正の整数NとM(0学生ID番号はそれぞれ1からNに編成される.2行目はN個の整数を含み、このN個の学生の初期成績を表し、i番目の数はIDがiの学生の成績を表す.次はM行である.各行には1つの文字C(‘Q’または‘U’のみ)と2つの正の整数A,Bがある.Cが「Q」である場合、IDがAからB(A,Bを含む)までの学生の中で、成績が最も高いかを尋ねる質問操作であることを示す.Cが「U」の場合、IDがAの学生の成績をBに変更する更新操作であることを示す.
Output
問合せ操作ごとに、1行に最高成績を出力します.
Sample Input
5 6
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5

Sample Output
5
6
5
9


        
  

Hint
Huge input,the C function scanf() will work better than cin
        
  
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define eps 1e-6
#define LL long long
using namespace std;
int s[1000000];
int segTree[2000010];
int N,M;
void build(int node,int l,int r)
{
	if(l==r)
	{
		segTree[node]=s[l];
		return;
	}
	else
	{
		build(node<<1,l,(l+r)/2);
		build((node<<1)+1,(l+r)/2+1,r);
		segTree[node] = max(segTree[node<<1] ,segTree[(node<<1)+1]);
	}
}

int query(int a,int b,int now,int l,int r)
{
	if(a<=l && b>=r) return segTree[now];
	int ans=0,mid=(l+r)>>1;
	if(a<=mid) ans=max(ans,query(a,b,now<<1,l,mid));
	if(b>mid) ans=max(ans,query(a,b,(now<<1)+1,mid+1,r));// , >;
	return ans;
}

void update(int k,int add,int now,int l,int r)
{
	if(k==l && l==r)
	{
		segTree[now]=add;
		return;
	}
	if(k<=(l+r)/2) update(k,add,now<<1,l,(l+r)/2);
	else update(k,add,(now<<1)+1,(l+r)/2+1,r);
	segTree[now]=max(segTree[now<<1],segTree[(now<<1)+1]);
}

int main()
{
    while(~scanf("%d%d",&N,&M))
    {
    	for(int i=1;i<=N;i++)
            scanf("%d",&s[i]);
	   	build(1,1,N);
	   	for(int i=1;i<=M;i++)
	    {
	   		int a,b;
			char order;
			getchar();
	    	order=getchar();

	    	scanf("%d%d",&a,&b);
	   		if(order=='Q') printf("%d
",query(a,b,1,1,N)); else update(a,b,1,1,N); } } return 0; }