HDu 1754セグメントツリー


I Hate It
Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3375    Accepted Submission(s): 1123
Problem Description
多くの学校では比較的な習慣が流行している.先生たちは聞くのが好きで、○○から○○までの中で、点数が一番高いのはいくらですか.
これは多くの学生に反感を抱かせた.
あなたが喜ぶかどうかにかかわらず、今あなたがしなければならないのは、先生の要求に従って、プログラムを書いて、先生の質問をシミュレートすることです.もちろん、先生はある同級生の成績を更新する必要があることがあります.
 
 
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
      ,    U     update    。

#include<iostream>
using namespace std;
#define Max 200010
#define max(a,b) (a>b?a:b)

struct node
{
	int l,r;
	int highest;
	struct node *lchild,*rchild;
};
node mem[400010];
int pos;
int score[Max];
node *new_tree()
{
	node *pt=&mem[pos++];
	memset(pt,0,sizeof(pt));
	return pt;
}

node *create(int il,int ir)
{
	node* root=new_tree();
	root->l=il;
	root->r=ir;
	if(ir-il>1)
	{
		int mid=(il+ir)/2;
		root->lchild=create(il,mid);
		root->rchild=create(mid,ir);
		root->highest=max(root->lchild->highest,root->rchild->highest);
	}
	else
		root->highest=max(score[root->l],score[root->r]);
	return root;
}

void update(node* now,int id)
{
	if(now->r-now->l==1)
	{
		now->highest=max(score[now->l],score[now->r]);
		return ;
	}
	if(now->lchild->r>=id)
		update(now->lchild,id);
	if(now->rchild->l<=id)
		update(now->rchild,id);
	now->highest=max(now->lchild->highest,now->rchild->highest);
	return ;
}

int search(node *now,int il,int ir)
{
	if(now->l==il&&now->r==ir)
	{
		return now->highest;
	}
	int mid=(now->l+now->r)/2;
	if(il>=mid)
		return search(now->rchild,il,ir);
	if(ir<=mid)
		return search(now->lchild,il,ir);
	else
	{
		int temp1=search(now->lchild,il,mid);
		int temp2=search(now->rchild,mid,ir);
		return max(temp1,temp2);
	}
}

int main()
{
	node* root;
	char ch;
	int m,n,i,id1,id2;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		pos=0;
		for(i=1;i<=n;i++)
			scanf("%d",&score[i]);
		root=create(1,n);
		getchar();
		while(m--)
		{
			ch=getchar();
			scanf("%d%d",&id1,&id2);
			getchar();
			if(ch=='Q')
			{
				if(id1==id2)
					printf("%d/n",score[id1]);
				else printf("%d/n",search(root,id1,id2));
			}
			else
			{
				score[id1]=id2;
				update(root,id1);
			}
		}
	}
	return 0;
}