HDU (线段树 单点更新) I Hate It
和上一道题没什么变化,只不过把单点增减变成了单点替换,把区间求和变成了区间求最大值。
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 5 const int maxn = (1 << 20); 6 7 int n, m, qL, qR, p, v; 8 int _max[maxn]; 9 10 void build(int o, int L, int R) 11 { 12 if(L == R) { scanf("%d", &_max[o]); return; } 13 int M = (L + R) / 2; 14 build(o*2, L, M); 15 build(o*2+1, M+1, R); 16 _max[o] = max(_max[o*2], _max[o*2+1]); 17 } 18 19 void update(int o, int L, int R) 20 { 21 if(L == R) { _max[o] = v; return; } 22 int M = (L + R) / 2; 23 if(p <= M) update(o*2, L, M); 24 else update(o*2+1, M+1, R); 25 _max[o] = max(_max[o*2], _max[o*2+1]); 26 } 27 28 int query(int o, int L, int R) 29 { 30 if(qL <= L && qR >= R) return _max[o]; 31 int ans = -1; 32 int M = (L + R) / 2; 33 if(qL <= M) ans = max(ans, query(o*2, L, M)); 34 if(qR > M) ans = max(ans, query(o*2+1, M+1, R)); 35 return ans; 36 } 37 38 char op[10]; 39 40 int main() 41 { 42 //freopen("in.txt", "r", stdin); 43 44 while(scanf("%d%d", &n, &m) == 2) 45 { 46 build(1, 1, n); 47 48 while(m--) 49 { 50 scanf("%s", op); 51 if(op[0] == 'Q') 52 { 53 scanf("%d%d", &qL, &qR); 54 printf("%d\n", query(1, 1, n)); 55 } 56 else 57 { 58 scanf("%d%d", &p, &v); 59 update(1, 1, n); 60 } 61 } 62 } 63 64 return 0; 65 }