题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754
这是又是一道线段树单点更新的模板题;之前有详细的解释过单点更新,这里就不说了,直接看代码吧。
#include<iostream> #include<string> #include<cstdio> #include<cstring> #include<queue> #include<map> #include<set> #include<vector> #include<algorithm> #define LL long long #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 using namespace std; const int N=200005; int n,m,a,b; char ch; struct node { int l,r,v; }node[N<<2]; void build(int l,int r,int rt) // 建树; { node[rt].l=l; node[rt].r=r; node[rt].v=0; if(l==r) return; int mid=(l+r)>>1; build(lson); build(rson); } int PushUp(int rt) // 父节点跟新数据; { return node[rt].v=max(node[rt<<1].v,node[rt<<1|1].v); } void Insert(int p,int t,int rt) // 插入数据; { if(node[rt].l==node[rt].r&&p==node[rt].l){ node[rt].v=t; return; } int mid=(node[rt].l+node[rt].r)>>1; if(p<=mid) Insert(p,t,rt<<1); else Insert(p,t,rt<<1|1); PushUp(rt); } int query(int l,int r,int rt) // 查询语句; { if(node[rt].l==l&&node[rt].r==r){ return node[rt].v; } int mid=(node[rt].l+node[rt].r)>>1; if(r<=mid) return query(l,r,rt<<1); else if(l>mid) return query(l,r,rt<<1|1); else return max(query(l,mid,rt<<1),query(mid+1,r,rt<<1|1)); } int main() { while(~scanf("%d%d",&n,&m)){ build(1,n,1); for(int i=1;i<=n;i++){ scanf("%d",&a); Insert(i,a,1); } while(m--){ scanf(" %c",&ch); if(ch=='Q'){ scanf("%d%d",&a,&b); printf("%d\n",query(a,b,1)); }else{ scanf("%d%d",&a,&b); Insert(a,b,1); } } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/wlxsq/article/details/46944239