您的位置:首页 > 其它

hdu 1754 线段树之二

2014-08-01 17:17 113 查看
还是挺简单的

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
struct p
{
int l;
int r;
int max;
}tree[888888];
int value[222222];
void construct(int n,int l,int r)
{
int i,j,k,m;
int mid=(l+r)/2;
tree[n].l=l;
tree[n].r=r;
if(l==r)
{
tree[n].max=value[l];
return;
}
construct(n*2,l,mid);
construct(n*2+1,mid+1,r);
tree[n].max=max(tree[n*2].max,tree[n*2+1].max);
}
void change(int n,int l,int r,int k)
{
int i,j,m;
int mid=(tree[n].l+tree[n].r)/2;
if(l==tree[n].l&&r==tree[n].r)
{
tree[n].max=k;
return;
}
if(r<=mid)
{
change(n*2,l,r,k);
}
else
{
change(n*2+1,l,r,k);
}
tree[n].max=max(tree[n*2].max,tree[n*2+1[b]].max);
}
int query(int l,int r,int n)
{
int i,j,k,m=0;
if(tree[n].l==l&&tree[n].r==r)
{
return (tree[n].max);
}
int mid=(tree[n].l+tree[n].r)/2;
if(r<=mid)
{
m=max(m,query(l,r,n*2));
}
else if(l>mid)
{
m=max(m,query(l,r,n*2+1));

}
else
{
m=max(m,query(l,mid,n*2));
m=max(m,query(mid+1,r,n*2+1));
}
return m;
}
int main()
{
int i,j,k,l,m,n,r;
char s[11];
while(scanf("%d%d",&n,&m)==2)
{

for(i=1;i<=n;i++)
{
scanf("%d",&value[i]);
}
construct(1,1,n);
for(i=0;i<m;i++)
{
scanf("%s%d%d",s,&l,&r);
if(s[0]=='Q')
{
printf("%d\n",query(l,r,1));
}
if(s[0]=='U')
{
change(1,l,l,r);
}
}
}
}


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