第一次写线段树,参考了一下别人的线段树代码
#define L(x) (x << 1)
#define R(x) ((x << 1) | 1)
code:
#include <stdio.h>
#define max(x,y) x>y?x:y
const int MAX = 200005;
struct Tree{
int left; int right; int data;
}tr[MAX*3];
int n,m,s[MAX],a,b;
char cmd;
void build(int l,int r,int pos){
tr[pos].left = l;
tr[pos].right = r;
if(l == r){
tr[pos].data = s[l];
return;
}
int mid = (l + r) >> 1;
build(l,mid,(pos<<1));
build(mid+1,r,(pos<<1)+1);
tr[pos].data = max(tr[pos<<1].data,tr[(pos<<1)+1].data);
}
void Update(int l,int r,int pos){
if(l == r){
tr[pos].data = b; return;
}
int mid = (l + r) >> 1;
if(a <= mid) {
Update(l,mid,pos<<1);
}else if (a > mid){
Update(mid+1,r,(pos<<1)+1);
}
tr[pos].data = max(tr[pos<<1].data,tr[(pos<<1)+1].data);
}
int Query(int sta,int end,int pos){
if(tr[pos].left == sta && tr[pos].right == end)
return tr[pos].data;
int mid = (tr[pos].left + tr[pos].right)>>1;
if(end <= mid){
return Query(sta,end,pos<<1);
}
else if(sta > mid){
return Query(sta,end,(pos<<1)+1);
}else{
int x = Query(sta,mid,pos<<1);
int y = Query(mid+1,end,(pos<<1)+1);
return max(x,y);
}
}
int main(){
int n,m,i,temp;
char cmd;
while(~scanf("%d%d",&n,&m)){
for(i=1;i<=n;i++)
scanf("%d",&s[i]);
build(0,n,1);
for(i = 0;i < m;++i){
getchar();
scanf("%c %d %d",&cmd,&a,&b);
if(cmd == 'Q')
printf("%d\n",Query(a,b,1));
else
Update(0,n,1);
}
}
}
来源:https://www.cnblogs.com/nulle/archive/2011/08/22/2149692.html