本文共 2066 字,大约阅读时间需要 6 分钟。
5 61 2 3 4 5Q 1 5U 3 6Q 3 4Q 4 5U 2 9Q 1 5
5659 Hint Huge input,the C function scanf() will work better than cin
#include#include #include #include #include #define lson l,m,rt<<1 //lson表示左子树 #define rson m+1,r,rt<<1|1 //rson表示右子树 #define M 222222using namespace std;int MAX[M<<2];void pushup(int rt){ MAX[rt]=max(MAX[rt<<1],MAX[rt<<1|1]);// 比较左子树和右子树的大小 跟新节点数据 }void build(int l,int r,int rt){ if(l==r) //当左右节点为一个数时 输入这个数 叶子 { scanf("%d",&MAX[rt]); return ; } int m=(l+r)>>1; build(lson); build(rson); pushup(rt);}void update(int p,int add,int l,int r,int rt){ if(l==r)//找到在L与R之间的所有区间部分 比较每个区间的最大值 并持续更新 l与r是L与R的子区间 { MAX[rt]=add; return ; } int m=(l+r)>>1; if(p<=m)update(p,add,lson); //分成多个部分 如果左区间存在交集 比较左区间的最大值值 else update(p,add,rson); pushup(rt);}int query(int L,int R,int l,int r,int rt){ if(L<=l&&R>=r) { return MAX[rt]; } int m=(r+l)>>1; int res=0; if(L<=m) res=max(res,query(L,R,lson)); if(R>m) res=max(res,query(L,R,rson)); return res;}int main(){ int n,m; while(~scanf("%d%d",&n,&m)) { build(1,n,1);//树从是第一个节点开始 while(m--) { char op[2]; int a,b; scanf("%s%d%d",op,&a,&b); if(op[0]=='Q') printf("%d\n",query(a,b,1,n,1)); else update(a,b,1,n,1); } } return 0;}/*5 61 2 3 4 5Q 1 5U 3 6Q 3 4Q 4 5U 2 9Q 1 55659*/
转载地址:http://jafci.baihongyu.com/