题意:
1~N这些人有一些分数,之后有M条操作。要求支持两种操作:更新其中某个人的成绩,查询[A,B]区间内的人的最高成绩。 ( 0<N<=200000,0<M<5000 )
思路:
简单线段树。
Just Do it.
写这个仅仅是为了有一个模板。
代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 200020 #define lson l, mid, rt<<1 #define rson mid+1, r, rt<<1|1 int tree[N<<2]; void pushUp(int rt) { tree[rt] = max(tree[rt<<1], tree[rt<<1|1]); } void build(int l, int r, int rt) { if (l == r) { scanf("%d", &tree[rt]); return; } int mid = (l+r)/2; build(lson); build(rson); pushUp(rt); } int query(int L, int R, int l, int r, int rt) { if (L <= l && r <= R) { return tree[rt]; } int mid = (l+r)/2; int ans = 0; if (L <= mid) ans = max(ans, query(L,R,lson)); if (R > mid) ans = max(ans, query(L,R,rson)); return ans; } void update(int pos, int v, int l, int r, int rt) { if (l == r) { tree[rt] = v; return; } int mid = (l+r)/2; if (pos <= mid) update(pos, v, lson); if (pos > mid) update(pos, v, rson); pushUp(rt); } int main() { int n ,m; while (scanf("%d%d", &n, &m) != EOF) { build(1,n,1); char com[30]; for (int i = 0; i < m; i++) { int a, b; scanf("%s%d%d", com, &a, &b); if (com[0] == 'U') { update(a,b,1,n,1); } if (com[0] == 'Q') { printf("%d ", query(a,b,1,n,1)); } } } return 0; }