hdoj1754 I Hate It

2521 ワード

タイトル:


Problem Descriptionは多くの学校で比較的な習慣が流行している.先生たちは聞くのが好きで、○○から○○までの中で、点数が一番高いのはいくらですか.これは多くの学生に反感を抱かせた.あなたが喜ぶかどうかにかかわらず、今あなたがしなければならないのは、先生の要求に従って、プログラムを書いて、先生の質問をシミュレートすることです.もちろん、先生はある同級生の成績を更新する必要があることがあります.Inputこの問題には複数のテストが含まれています.ファイルが終わるまで処理してください.各試験の最初の行には、2つの正の整数NとM(0 Outputは、各問合せ操作について、1行において最高成績を出力する.Sample Input 5 6 1 2 3 4 Q 1 5 U 3 6 Q 3 4 Q 4 U 2 9 Q 1 5 Sample Output 5 6 5 5 5 9 Hint Huge input,the C function scanf()will work better than cin


  • この問題は中国語の問題で、基本的な線分ツリー操作です.

    参照コード:

    #include 
    #include 
    #include 
    #include 
    #define N 200000+20
    using namespace std;
    struct node { // ;
        int left,right;
        int max;
    } e[4 * N];
    int a[N];
    void init() {
        memset(a,0,sizeof(a));
        memset(e,0,sizeof(e));
    }
    void input(int n) {
        for (int i = 1;i <= n;++i) {
            scanf("%d", &a[i]);
        }
    }
    void build(int p,int l,int r) { // ;
        e[p].left = l;
        e[p].right = r;
        e[p].max = a[l];
        if (l != r) {
            int mid = (l + r) / 2;
            build(2*p,l,mid);
            build(2*p+1,mid+1,r);
            e[p].max = max(e[p*2].max,e[p*2+1].max);
        }
    }
    void update(int p,int pos,int val) { // ;
        if (e[p].left == e[p].right) {
            e[p].max = val;
        }
        else {
            int mid = (e[p].left+e[p].right) / 2;
            if (pos <= mid) update(2*p,pos,val);
            else update(2*p+1,pos,val);
            e[p].max = max(e[2*p].max,e[2*p+1].max);
        }
    }
    int query(int p,int l,int r) { // ;
        if (l <= e[p].left && e[p].right <= r) {
            return e[p].max;
        }
        int ans = 0;
        int mid = (e[p].left+e[p].right) / 2;
        if (l <= mid) ans = max(ans,query(p*2,l,r));
        if (r > mid) ans = max(ans,query(p*2+1,l,r));
        return ans;
    }
    int main() {
        int n,m;
        while (scanf("%d%d", &n, &m) != EOF) {
            init();
            input(n);
            build(1,1,n);
            char c;
            for (int i = 1;i <= m;++i) {
                scanf(" %c", &c);
                int x,y;
                if (c == 'Q') {
                    scanf("%d%d", &x, &y);
                    int ans = query(1,x,y);
                    printf("%d
    ", ans); } else { int std,val; scanf("%d%d", &std, &val); update(1,std,val); } } } return 0; }