hdu1754线段树
2011-09-21 15:51
246 查看
#include "iostream"
#include <cstdio>
#define MAX 200005
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)+1)
using namespace std;
struct node
{
int l,r,m;
};
int score[MAX];
node tree[MAX*3];
int N,M,p,q;
char cmd[2];
int mmax(int x,int y)
{
return x>y? x:y;
}
int build(int l,int r,int i)//从下到上建树
{
tree[i].l=l;
tree[i].r=r;
if(l==r)
{
tree[i].m=score[l];
return 0;
}
int mid=(l+r)>>1;
build(l,mid,lc(i));//左儿子节点
build(mid+1,r,rc(i));//右儿子节点
tree[i].m=mmax(tree[lc(i)].m,tree[rc(i)].m);//父亲节点是其左右儿子中的大的
return 0;
}
int renew(int i ,int num, int newv)//从下向上更新树
{
if(tree[i].r==num&&tree[i].l==num)
tree[i].m=newv;
else
{
if(num<=tree[lc(i)].r)
renew(lc(i),num,newv);
else
renew(rc(i),num,newv);
tree[i].m=mmax(tree[lc(i)].m,tree[rc(i)].m);
}
return 0;
}
int finds(int a,int b,int i)//查找
{
if(a<=tree[i].l&&tree[i].r<=b)
return tree[i].m;
if(b<=tree[lc(i)].r)
return finds(a,b,lc(i));
if(a>=tree[rc(i)].l)
return finds(a,b,rc(i));
return mmax(finds(a,tree[lc(i)].r,lc(i)),finds(tree[rc(i)].l,b,rc(i)));
}
int main()
{
int i;
while(scanf("%d %d",&M,&N)!=EOF)
{
for(i=1;i<=M;i++)
scanf("%d",&score[i]);
build(1,M,1);
for(i=1;i<=N;i++)
{
scanf("%s %d %d",cmd,&p,&q);
if(cmd[0]=='Q')
printf("%d\n",finds(p,q,1));
else if(cmd[0]=='U')
renew(1,p,q);
}
}
return 0;
}
#include <cstdio>
#define MAX 200005
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)+1)
using namespace std;
struct node
{
int l,r,m;
};
int score[MAX];
node tree[MAX*3];
int N,M,p,q;
char cmd[2];
int mmax(int x,int y)
{
return x>y? x:y;
}
int build(int l,int r,int i)//从下到上建树
{
tree[i].l=l;
tree[i].r=r;
if(l==r)
{
tree[i].m=score[l];
return 0;
}
int mid=(l+r)>>1;
build(l,mid,lc(i));//左儿子节点
build(mid+1,r,rc(i));//右儿子节点
tree[i].m=mmax(tree[lc(i)].m,tree[rc(i)].m);//父亲节点是其左右儿子中的大的
return 0;
}
int renew(int i ,int num, int newv)//从下向上更新树
{
if(tree[i].r==num&&tree[i].l==num)
tree[i].m=newv;
else
{
if(num<=tree[lc(i)].r)
renew(lc(i),num,newv);
else
renew(rc(i),num,newv);
tree[i].m=mmax(tree[lc(i)].m,tree[rc(i)].m);
}
return 0;
}
int finds(int a,int b,int i)//查找
{
if(a<=tree[i].l&&tree[i].r<=b)
return tree[i].m;
if(b<=tree[lc(i)].r)
return finds(a,b,lc(i));
if(a>=tree[rc(i)].l)
return finds(a,b,rc(i));
return mmax(finds(a,tree[lc(i)].r,lc(i)),finds(tree[rc(i)].l,b,rc(i)));
}
int main()
{
int i;
while(scanf("%d %d",&M,&N)!=EOF)
{
for(i=1;i<=M;i++)
scanf("%d",&score[i]);
build(1,M,1);
for(i=1;i<=N;i++)
{
scanf("%s %d %d",cmd,&p,&q);
if(cmd[0]=='Q')
printf("%d\n",finds(p,q,1));
else if(cmd[0]=='U')
renew(1,p,q);
}
}
return 0;
}
相关文章推荐
- hdu 1754 I Hate It (线段树--求区间最大值)(基础)
- hdu 1754 线段树入门 单点更新
- hdu 1754 I Hate It(线段树入门)
- HDU 1754 I Hate It(线段树)
- HDU - 1754 - I Hate It (线段树 - 区间最值)
- ACM 粗心永远AC不了系列——HDU 1754 I Hate It|线段树区间求最值
- HDU 1754 I Hate It (线段树)
- HDU 1754 线段树应用(二)
- HDU1754 I HATE IT【线段树】
- HDU 1754 I Hate It 线段树
- HDU 1754 I Hate It(线段树维护 区间最值)
- hdu - 1754 - I Hate It(线段树(单点更新))
- hdu 1754 线段树
- hdu 1754 I Hate It (线段树 单点更新)
- HDU 1754 I Hate It (线段树,模板)
- hdu1754 线段树(查找和单点更新)
- HDU 1754 I Hate It (线段树 区间最值)
- hdu 1754 线段树入门(单点替换,区间最值)
- HDU1754(I hate it!--线段树单点更新,查找最大值)
- HDU -1754线段树