您的位置:首页 > 其它

hdu 1754 线段树

2014-06-30 23:34 134 查看
#include<iostream>
#include<cstdio>
#define MAX 200005
using namespace std;

int tree[MAX*4];

void build(int s,int e,int n)
{
if(e==s)
{
scanf("%d",&tree
);
return ;
}
int mid=(s+e)/2;
build(s,mid,2*n);
build(mid+1,e,2*n+1);
tree
=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
;
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
=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
=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);elsereturn 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));elsemodify(A,B,1);}}return 0;}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: