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;
}