标签:线段树
线段树水题,复习一下线段树
#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