Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9465 Accepted Submission(s): 3534
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
5 6 5 9
#include <iostream> #include <stdio.h> #include <cstring> using namespace std; struct node { int left, right, mid; int maxn; }w[4*200005]; int val[200005]; int creat(int a, int b, int r) //建树 { if(a == b) { w[r].left = w[r].right = a; w[r].maxn = val[a]; return w[r].maxn; } w[r].left = a; w[r].right = b; w[r].mid = (a+b)/2; w[r].maxn = max(creat(a, w[r].mid, 2*r), creat(w[r].mid+1, b, 2*r+1)); return w[r].maxn; } void update(int n, int m, int r) //更新 { if(w[r].left == n && w[r].right == n) { w[r].maxn = m; return; } if(n > w[r].mid) { update(n, m, 2*r+1); w[r].maxn = max(w[2*r].maxn, w[2*r+1].maxn); } else { update(n, m, 2*r); w[r].maxn = max(w[2*r].maxn, w[2*r+1].maxn); } } int query(int a, int b, int r) //询问 { if(w[r].left == a && w[r].right == b) { return w[r].maxn; } else if(a > w[r].mid) { return query(a, b, 2*r+1); } else if(b <= w[r].mid) { return query(a, b, 2*r); } else { return max(query(a, w[r].mid, 2*r), query(w[r].mid+1, b, 2*r+1)); } } int main() { char sh; int i, t, n, x, y; while(scanf("%d %d", &n, &t) != EOF) { for(i = 1; i <= n; i++) { scanf("%d", &val[i]); } creat(1, n, 1); while(t--) { cin>>sh; scanf("%d %d", &x, &y); if(sh == 'Q') { printf("%d\n", query(x, y, 1)); } else if(sh == 'U') { update(x, y, 1); } } } return 0; }