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 9HintHuge input,the C function scanf() will work better than cin
代码如下:
#include <cstdio> #include <cstring> #include <algorithm> #define MAX 200000 using namespace std; struct TREE { int Max; int l,r; }tree[MAX<<2]; void PushUp(int o) { tree[o].Max = max (tree[o << 1].Max , tree[o << 1 | 1].Max); } void Build(int o,int l,int r) { tree[o].l = l; tree[o].r = r; if (l == r) { scanf ("%d",&tree[o].Max); return; } int mid = (l + r) >> 1; Build (o << 1 , l , mid); Build (o << 1 | 1 , mid + 1 , r); PushUp(o); } void UpDate(int o,int x,int y) { if (tree[o].l == tree[o].r) { tree[o].Max = y; return; } int mid = (tree[o].l + tree[o].r) >> 1; if (x <= mid) UpDate (o << 1 , x , y); else UpDate (o << 1 | 1 , x , y); PushUp(o); } int Query(int o,int l,int r) { if (tree[o].l == l && tree[o].r == r) return tree[o].Max; int mid = (tree[o].l + tree[o].r) >> 1; if (mid >= r) return Query (o << 1 , l , r); else if (l > mid) return Query (o << 1 | 1 , l , r); else return max (Query (o << 1 , l , mid) , Query (o << 1 | 1 , mid + 1 , r)); } int main() { int n,m; while (~scanf ("%d %d",&n,&m)) { Build(1,1,n); while (m--) { char op[2]; int x,y; scanf ("%s %d %d",op,&x,&y); if (op[0] == 'Q') printf ("%d\n",Query(1,x,y)); else UpDate (1,x,y); } } return 0; }