http://acm.hdu.edu.cn/showproblem.php?pid=1754
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
这是我做的第二道线段树,和敌兵布阵几乎一模一样。以下链接是敌兵布阵,有详细解释。。。
链接:http://blog.csdn.net/hellohelloc/article/details/47731551
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=200020; int n,m; struct node{ int left,right,miv; }t[4*maxn]; void build(int k,int l,int r)//建立线段树 { t[k].left=l;t[k].right=r; if(l==r){ scanf("%d",&t[k].miv); return; } int mid=(l+r)>>1; build(k<<1,l,mid); build(k<<1|1,mid+1,r); t[k].miv=max(t[k<<1].miv,t[k<<1|1].miv);//记录每个节点的管辖段内最大值 } void update(int k,int x,int val)//单点更新 { int l=t[k].left,r=t[k].right; if(x==l && x==r){ t[k].miv=val; return; } int mid=(l+r)>>1; if(x<=mid) update(k<<1,x,val); else update(k<<1|1,x,val); t[k].miv=max(t[k<<1].miv,t[k<<1|1].miv);维护节点的最大值 } int query(int k,int x,int y)//区间查询 { int l=t[k].left,r=t[k].right; int ans=-1; if(x<=l && r<=y){ return t[k].miv; } int mid=(l+r)>>1; if(x<=mid) ans=max(ans,query(k<<1,x,y)); if(y>mid) ans=max(ans,query(k<<1|1,x,y)); return ans; } int main() { char op[5]; int a,b; while(scanf("%d %d",&n,&m) !=EOF) { memset(t,0,sizeof(t));//初始化,为了避免第二次样例时出错 build(1,1,n); while(m--) { scanf("%s%d%d",op,&a,&b); if(op[0]=='Q') printf("%d\n",query(1,a,b)); else update(1,a,b); } } return 0; }