hdu 1754 线段树

来源:互联网 发布:固态硬盘坏了数据恢复 编辑:程序博客网 时间:2024/05/18 13:29
#include<iostream>#include<cstdio>#define MAX 200005using namespace std;int tree[MAX*4];void build(int s,int e,int n){    if(e==s)    {        scanf("%d",&tree[n]);        return ;    }    int mid=(s+e)/2;    build(s,mid,2*n);    build(mid+1,e,2*n+1);    tree[n]=max(tree[2*n],tree[2*n+1]);}int query(int s,int e,int a,int b,int n){    if(s==a&&e==b)        return tree[n];    int mid=(s+e)/2;    if(b<=mid) return query(s,mid,a,b,2*n);    else if(mid<a) return query(mid+1,e,a,b,2*n+1);    else      return max(query(s,mid,a,mid,2*n),query(mid+1,e,mid+1,b,2*n+1) );}void modify(int s,int e,int a,int b,int n){    if(s==e)       { tree[n]=b ;   return ; }    int mid=(s+e)/2;    if(a<=mid) modify(s,mid,a,b,2*n);    else modify(mid+1,e,a,b,2*n+1) ;    tree[n]=max(tree[2*n],tree[2*n+1]) ;   //   max}/*void show(int s,int e,int n){    cout<<"tree["<<n<<"]=["<<s<<","<<e<<']'<<endl;    if(s==e) return ;     int mid=(s+e)/2;    show(s,mid,2*n);    show(mid+1,e,2*n+1); }*/int main(){    int n,m,i,a,b;    char c[4];    while(scanf("%d%d",&n,&m)!=EOF)    {       build(1,n,1);       while(m--)       {            getchar();            scanf("%s%d%d",c,&a,&b);           if(c[0]=='Q')              printf("%d\n",query(1,n,a,b,1) );           else              modify(1,n,a,b,1);       }    }    return 0;}
<pre name="code" class="cpp">#include<iostream>   //  ac#include<cstdio>#include<cstring>using namespace std;struct line{int le,ri,n;}a[1000000];   //  kai 100 0000int b[200005];int insert(int s,int e,int m)    //  insert 返回最大值  ==query{    if(a[m].le==s&&e==a[m].ri)       return a[m].n ;    int  mid=(a[m].le+a[m].ri)/2;    if(e<=mid&&s<=mid) return insert(s,e,2*m);    else if(mid<s) return insert(s,e,2*m+1);    else      return max( insert(s,mid,2*m) , insert(mid+1,e,2*m+1) );}void modify(int s,int e,int m){    if(a[m].le==a[m].ri){       a[m].n=e;       return  ;    }    int  mid=(a[m].le+a[m].ri)/2;    if(s<=mid)  modify(s,e,2*m);    else  modify(s,e,2*m+1);    a[m].n=max( insert(a[m].le,mid,2*m) , insert(mid+1,a[m].ri,2*m+1) ) ;}void build(int s,int e,int m ){    a[m].le=s;    a[m].ri=e;    int mid=(s+e)/2;    if(s==e)    {a[m].n=b[mid];        return ;}    build(s,mid,2*m);    build(mid+1,e,2*m+1);    a[m].n=max( a[2*m].n , a[2*m+1].n  );}int main(){    int n,m,i,A,B;    char C;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(i=1;i<=n;i++)            scanf("%d",&b[i]);        build(1,n,1);        while(m--)        {            getchar();           scanf("%c%d%d",&C,&A,&B);           // cin>>C>>A>>B;           if(C=='Q')             printf("%d\n",insert(A,B,1));           else            modify(A,B,1);        }    }    return 0;}



0 0