hdu_1754_线段树模板题

//线段树模板题,没什么好讲的

#include<iostream>

#include<cstdio>

#include<cmath>

using namespace std;

 

struct tree

{

int l,r,key;

}node[600200];    //刚开始开的数组大小为4000005,错了n次,问了牛人,说一般都要开3*n,因为总退超出一层

int score[300005];

int n,m;

 

int max(int a,int b)

{

return a<b?b:a;

}

 

int creat(int a,int b,int i)  //从a到b离散化建树

{

int mid=(a+b)/2;

node[i].l=a;

node[i].r=b;

if(a==b)

{

node[i].key=score[a];

return

node[i].key;

}

else

{

node[i].key=max(creat(a,mid,2*i),creat(mid+1,b,2*i+1));

return

node[i].key;

}

}

 

void update(int i,int a,int key)   //对点a更新为key

{

node[i].key=max(node[i].key,key);

int mid=(node[i].l+node[i].r)/2;

if(node[i].l==node[i].r)

return ;

if(a>mid)

update(2*i+1,a,key);

else

update(2*i,a,key);

}

 

int query(int i,int a,int b)     //询问区间a到b的key值

{

if(node[i].l>=a&&node[i].r<=b)

return

node[i].key;

else

{

int mid=(node[i].l+node[i].r)/2;

if(a<=mid&&b>=mid+1)

return max(query(2*i,a,mid),query(2*i+1,mid+1,b));

else

{

if(b>=mid+1)

return query(2*i+1,a,b);

else

return query(2*i,a,b);

}

}

}

 

int main()

{

char ch;

int a,b;

while(scanf("%d %d",&n,&m)!=EOF)

{

int i,j;

for(i=1;i<=n;i++)

scanf("%d",&score[i]);

creat(1,n,1);

while(m--)

{

getchar();

scanf("%c %d %d",&ch,&a,&b);

if(ch=='U')

update(1,a,b);

else

printf("%d/n",query(1,a,b));

}

}

return 0;

}

你可能感兴趣的:(c,tree,query)