线段树基础题,区间最值,单点修改
细节参见代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int INF = 1000000000; const int maxn = 300000+10; int T,n,A,B,m,maxv[maxn<<1]; void push_up(int o) { maxv[o] = max(maxv[o<<1],maxv[o<<1|1]); } void build(int l, int r, int o) { int m = (l + r) >> 1; if(l == r) { scanf("%d",&maxv[o]); return ; } build(l, m, o<<1); build(m+1, r, o<<1|1); push_up(o); } void update(int p, int v, int l, int r, int o) { int m = (l + r) >> 1; if(l == r) { maxv[o] = v; return ; } if(p <= m) update(p, v, l, m, o<<1); else update(p, v, m+1, r, o<<1|1); push_up(o); } int query(int L, int R, int l, int r, int o) { int m = (l + r) >> 1, ans = -INF; if(L <= l && r <= R) { return maxv[o]; } if(m >= L) ans = max(ans, query(L, R, l, m, o<<1)); if(m+1 <= R) ans = max(ans, query(L, R, m+1, r, o<<1|1)); return ans; } char s[10]; int main() { while(~scanf("%d%d",&n,&m)) { build(1,n,1); while(m--) { scanf("%s%d%d",s,&A,&B); if(s[0] == 'Q') printf("%d\n",query(A,B,1,n,1)); else update(A,B,1,n,1); } } return 0; }