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

来源:互联网 发布:mac pro 13.3屏幕尺寸 编辑:程序博客网 时间:2024/06/05 02:13
//  [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;}
0 0
原创粉丝点击