您的位置:首页 > 其它

hdu1754-线段树(求区间最大值)

2011-11-27 21:02 281 查看
/*
//5517620	2012-03-10 20:40:02	Accepted	1754	2046MS	6376K	1829 B	G++	zjwzcnjsy
hdu1754-求区间最大值
*/
#include <stdio.h>
#include <string.h>
#define MAX 200000
#define max(a,b) a>b?a:b
struct  TNode {
int     l , r;
int     score;
}segtree[4*MAX+5];

void build(int n,int l,int r)
{
int mid = (l+r)/2;
segtree
.score = 0;
segtree
.l = l;
segtree
.r = r;
if(l!=r)
{
build(2*n,l,mid);
build(2*n+1,mid+1,r);
}
}

void insert(int n,int k,int c)
{
int mid=(segtree
.l+segtree
.r)/2;
if(segtree
.l==segtree
.r)
{
segtree
.score=c;
return;
}
if(k<=mid)
{
insert(2*n,k,c);
}
else
{
insert(2*n+1,k,c);
}
segtree
.score=max(segtree[2*n].score,segtree[2*n+1].score);
}

int question(int n,int l,int r)
{
int mid=(segtree
.l+segtree
.r)/2;
if(segtree
.l==l && segtree
.r==r)
{
return segtree
.score;
}
if(r<=mid)
{
return question(2*n,l,r);
}
if(l>mid)
{
return question(2*n+1,l,r);
}
int i=question(2*n,l,mid);
int j=question(2*n+1,mid+1,r);
return i>j?i:j;
}

int main()
{
int n,m,i,t,x1,x2,c;
char ch;
while(scanf("%d%d",&n,&m)!=EOF)
{
build(1,1,n);
for(i=1;i<=n;i++)
{
scanf("%d",&t);
insert(1,i,t);
}
while(m--)
{
scanf("\n%c%d%d",&ch,&x1,&x2);
if(ch=='U')
{
insert(1,x1,x2);
}
else
{
printf("%d\n",question(1,x1,x2));
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: