1.I Hate It
2674 ワード
多くの学校では比較的な習慣が流行している.先生たちは聞くのが好きで、○○から○○までの中で、点数が一番高いのはいくらですか.これは多くの学生に反感を抱かせた.あなたが喜ぶかどうかにかかわらず、今あなたがしなければならないのは、先生の要求に従って、プログラムを書いて、先生の質問をシミュレートすることです.もちろん、先生はある同級生の成績を更新する必要があることがあります.
入力
この問題には複数のテストが含まれています.ファイルが終わるまで処理してください.各試験の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に変更する更新操作であることを示す.
しゅつりょく
問合せ操作ごとに、1行に最高成績を出力します.
サンプル入力
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
サンプル出力
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
acコード
#include
#include
#include
#define INF 0x7fffffff
#define maxn 4000001
using namespace std;
int arr[maxn];
int tree[maxn];
int arr_size,node_size;
void build_tree(int start,int end,int node){
if(start==end){
tree[node]=arr[start];
}
else{
int mid=(start+end)/2;
int left_node=node<<1;
int right_node=node<<1|1;
build_tree(start,mid,left_node);
build_tree(mid+1,end,right_node);
tree[node]=max(tree[left_node],tree[right_node]);
}
}
void update_tree(int start,int end,int node,int val,int index){
if(start==end){
arr[index]=val;
tree[node]=val;
//cout<=start&&index<=mid){
update_tree(start,mid,left_node,val,index);
}
else{
update_tree(mid+1,end,right_node,val,index);
}
tree[node]=max(tree[right_node],tree[left_node]);
// cout<"<"<=end)return tree[node];
else
{
int mid=(start+end)/2;
int left_node=node<<1;
int right_node=node<<1|1;
int sum_left=querry_tree(start,mid,left_node, l, r);
int sum_right=querry_tree(mid+1,end,right_node,l,r);
return max(sum_left,sum_right);
}
return 0;
}
int main(){
int n,m;
while (cin>>n>>m)
{
for(int i=1;i<=n;i++){
scanf("%d",&arr[i]);
}
build_tree(1,n,1);
//for(int i=1;i<2*n-1;i++)cout<