分析:基础的点更新,区间查询最值的线段树
#include<cstdio> #include<cstring> #define lson l, m, i<<1 #define rson m + 1, r, i<<1|1 const int maxn = 200000 + 10; int sum[maxn<<2]; /**************************** 使用全局变量,可以减少函数参数 *****************************/ int ql, qr, p, v; /*********************** *******max函数********** ***********************/ int max(int a, int b){ return a > b ? a : b; } /*********************** *******求区间最值******** 区间最大值等于左右区间最大 值中较大的一个。 ************************/ void PushUP(int i){ sum[i] = max(sum[i<<1], sum[i<<1|1]); } /************************ **********建树*********** *************************/ void build(int l, int r, int i){ if(l == r){ scanf("%d", &sum[i]); return ; } int m = (l + r)>>1; build(lson); build(rson); PushUP(i); } /******************************* **************更新*************** ********************************/ void update(int l, int r, int i){ int m = (l + r)>>1; if(l == r) sum[i] = v; else{ if(p <= m) update(lson); else update(rson); PushUP(i); } } /********************************* ************查询****************** *********************************/ int query(int l, int r, int i){ int m = (l + r)>>1; int ans = -1; if(ql <= l && r <= qr) return sum[i]; if(ql <= m) ans = max(ans, query(lson)); if(m < qr) ans = max(ans, query(rson)); return ans; } int main(){ int n, m; char str[10]; while(~scanf("%d%d", &n, &m)){ build(1, n, 1); for(int i = 0; i < m; i++){ scanf("%s", str); if(str[0] == 'U'){ scanf("%d%d", &p, &v); update(1, n, 1); } else{ scanf("%d%d", &ql, &qr); printf("%d\n", query(1, n, 1)); } } } return 0; }
时间: 2024-10-22 06:37:55