您的位置:首页 > 其它

线段树(单点更新) 之 hdu 1754

2014-07-25 11:31 225 查看
//  [7/25/2014 Sjm]
/*
线段树单点更新水题。。。
*/

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define GetMid l + ((r-l)>>1)

const int MAX_N = 200005;
int MAX[MAX_N << 2];

void PushUp(int rt) { MAX[rt] = max(MAX[rt << 1], MAX[rt << 1 | 1]); }

void Build(int l, int r, int rt) {
if (l == r) { scanf("%d", &MAX[rt]); return; }
int m = GetMid;
Build(lson);
Build(rson);
PushUp(rt);
}

void Update(int p, int grade, int l, int r, int rt) {
if (l == r) { MAX[rt] = grade; return; }
int m = GetMid;
if (p <= m) { Update(p, grade, lson); }
else { Update(p, grade, rson); }
PushUp(rt);
}
int Query(int L, int R, int l, int r, int rt) {
if (L <= l && r <= R) { return MAX[rt]; }
int m = GetMid;
int ans = 0;
if (L <= m) { ans = max(ans, Query(L, R, lson)); }
if (R > m) { ans = max(ans, Query(L, R, rson)); }
return ans;
}

int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int N, M, a, b;
char ch[2];
while (~scanf("%d %d", &N, &M)) {
Build(1, N, 1);
while (M--) {
scanf("%s %d %d", ch, &a, &b);
if ('Q' == ch[0]) { printf("%d\n", Query(a, b, 1, N, 1)); }
else  { Update(a, b, 1, N, 1); }
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息