题目链接: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