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

5959 ワード

Problem Description


多くの学校では比較的な習慣が流行している.先生たちは聞くのが好きで、○○から○○までの中で、点数が一番高いのはいくらですか.これは多くの学生に反感を抱かせた.あなたが喜ぶかどうかにかかわらず、今あなたがしなければならないのは、先生の要求に従って、プログラムを書いて、先生の質問をシミュレートすることです.もちろん、先生はある同級生の成績を更新する必要があることがあります.

Input


この問題には複数のテストが含まれています.ファイルが終わるまで処理してください.各試験の最初の行には、2つの正の整数NとM(0)がある.

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
線分ツリー、簡単な問題
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <algorithm>
#define N 200005
#define ll long long
const int mm = 0x3f3f3f3f;
using namespace std;
int ans[N<<2];
void build(int begin, int end, int root)
{
    if (begin == end)
    {
        cin >> ans[root];
        return ;
    }
    int m = (begin+end)>>1;
    build(begin, m, root<<1);
    build(m+1, end, root<<1|1);
    ans[root] = max(ans[root<<1], ans[root<<1|1]);
}
void update(int pos, int result, int l, int r, int root) 
{
    if (l == r)
    {
        ans[root] = result;
        return ;
    }
    int m = (l+r)>>1;
    if (m >= pos)   update(pos, result, l, m, root<<1);
    else    update(pos, result, m+1, r, root<<1|1);
    ans[root] = max(ans[root<<1], ans[root<<1|1]);
}
int query(int L, int R, int l, int r, int root) 
{
    if (L <= l && R >= r)   return ans[root];
    int m = (l+r)>>1;
    int t = 0;
    if (L <= m) t = max(t, query(L, R, l, m, root<<1));
    if (R > m)  t = max(t, query(L, R, m+1, r, root<<1|1));
    return t;
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("1.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    int i, j, a, b, n, m;
    char c;
    while(cin >> n >> m)
    {
        memset(ans, 0, sizeof(ans));
        build(1, n, 1);
        while(m--)
        {
            cin >> c >> a >> b;
            if (c == 'U')
                update(a, b, 1, n, 1);
            else
                cout << query(a, b, 1, n, 1) << endl;
        }
    }
    return 0;
}