1.I Hate It

2674 ワード

  • I Hate It

  • 多くの学校では比較的な習慣が流行している.先生たちは聞くのが好きで、○○から○○までの中で、点数が一番高いのはいくらですか.これは多くの学生に反感を抱かせた.あなたが喜ぶかどうかにかかわらず、今あなたがしなければならないのは、先生の要求に従って、プログラムを書いて、先生の質問をシミュレートすることです.もちろん、先生はある同級生の成績を更新する必要があることがあります.
    入力
    この問題には複数のテストが含まれています.ファイルが終わるまで処理してください.各試験の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<