线段树水题,复习一下线段树
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define N 200005
struct Node{
int l,r,num,ma;
}node[N*4];
void build(int p,int l,int r){
node[p].l=l;
node[p].r=r;
node[p].num=0;
node[p].ma=0;
if(l==r) return;
int mid=(l+r)>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
}
void update(int p,int l,int r,int num){
if(node[p].l>r||node[p].r<l) return;
//printf("%d ",node[p].num);
if(node[p].l==l&&node[p].r==r) {
node[p].num=num;
node[p].ma=num;
//printf("%d ",node[p].num);
return;
}
int mid=(node[p].l+node[p].r)>>1;
if(r<=mid) update(p*2,l,r,num);
else if(l>mid) update(p*2+1,l,r,num);
else {
update(p*2,l,r,num);
update(p*2+1,l,r,num);
}
node[p].ma=max(node[p*2].ma,node[p*2+1].ma);
}
int query(int p,int l,int r){
if(node[p].l>r||node[p].r<l) return -1;
if(node[p].l>=l&&node[p].r<=r) {
return node[p].ma;
}
return max(query(p*2,l,r),query(p*2+1,l,r));
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
int tmp,i;
build(1,1,n);
for(i=1;i<=n;i++) {
scanf("%d",&tmp);
update(1,i,i,tmp);
}
char c;
for(i=0;i<m;i++){
//printf("%d %d\n",i,m);
int A,B;
getchar();
scanf("%c%d%d",&c,&A,&B);
if(c=='Q') printf("%d\n",query(1,A,B));
else update(1,A,A,B);
//printf("klsdajf");
}
}
return 0;
}原文:http://blog.csdn.net/lj94093/article/details/45442723