您的位置:首页 > 其它

hdu 1754 线段树

2012-07-31 08:57 141 查看
hdu 1754 区间求最大值

[code]


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<memory.h>
using namespace std;
const int maxn=200002;
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
int Max[maxn<<2],n,m,s[maxn];
char op[2];
void PushUP(int rt)
{
Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);
}
void build(int rt,int l,int r)
{
if(l==r)
{
Max[rt]=s[l];
return ;
}
int mid=(l+r)>>1;
build(lson);
build(rson);
PushUP(rt);
}
void update(int rt,int l,int r,int idx,int data)
{
if(l==r)
{
Max[rt]=data;
return;
}
int mid=(l+r)>>1;
if(mid>=idx) update(lson,idx,data);
else update(rson,idx,data);
PushUP(rt);
}
int query(int rt,int l,int r,int L,int R)
{
if(L<=l&&r<=R)
{
return Max[rt];
}
int mid=(l+r)>>1;
int s1=0,s2=0;
if(mid>=L) s1=query(lson,L,R);
if(R>mid) s2=query(rson,L,R);
return max(s1,s2);
}
int main()
{
int i,j,k,a,b;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=1;i<=n;i++)scanf("%d",&s[i]);
build(1,1,n);
for(i=1;i<=m;i++)
{
scanf("%s%d%d",&op,&a,&b);
if(op[0]=='Q')
{
printf("%d\n",query(1,1,n,a,b));
}
else
{
update(1,1,n,a,b);
}
}
}
return 0;
}
[/code]


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