HDU 1754 I Hate It (线段树模板题)更新一点的值 询问区间最大值
#include<iostream>
#include<stdio.h>
#include<string.h>
#define MAXX 5001000
using namespace std;
int A[MAXX] ;
struct node
{
int l ;
int r ;
int value ;
} node[MAXX] ;
int creattree (int ll , int rr , int i) // 创建线段树 将最大值更新在根节点
{
int mid = (ll + rr) / 2;
node[i].l = ll ;
node[i].r = rr ;
if (ll == rr)
{
node[i].value = A[ll] ;
return node[i].value ;
}
else
{
node[i].value = max (creattree(ll , mid , 2*i),creattree(mid+1 , rr , 2*i+1));
return node[i].value ;
}
}
void updata (int i , int pos , int d ) // 更改一点的值
{
int mid ;
node[i].value = max (node[i].value , d) ;
mid = (node[i].l + node[i].r) / 2 ;
if(node[i].l == node[i].r)
return ;
else if (pos > mid) // 更新右子树
updata(2*i+1 , pos , d) ;
else // 更新左子树
updata(2*i , pos , d);
}
int query (int i , int ll , int rr)
{
int mid = (node[i].l + node[i].r) / 2 ;
if(node[i].l == ll && node[i].r == rr )
return node[i].value ;
if(ll <= mid && rr >= mid+1 ) //区间被分成两部分
return max (query(2*i , ll , mid),query(2*i+1 , mid+1 , rr));
else if(rr <= mid && ll<=mid ) //区间在右子树
return query(2*i , ll , rr) ;
else //区间在左子树
return query(2*i+1 , ll , rr) ;
}
int main()
{
int n , m , i , a , b ;
char s ;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i = 1 ; i <= n ; i++)
{
scanf("%d",&A[i]);
}
creattree(1 , n , 1 );
while(m--)
{
getchar();
scanf("%c%d%d",&s,&a,&b);
if(s == 'U')
{
updata(1 , a , b ) ;
}
if(s == 'Q')
{
int ans = query(1 , a , b );
printf("%d\n",ans);
}
}
}
return 0;
}
// 树状数组
#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
#define MAXX 201000
using namespace std;
int C[MAXX] ,n , A[MAXX];
int lowbit(int x)
{
return x &(-x) ;
}
void init()
{
for(int i=1 ; i <= n ; i++)
{
C[i]=A[i];
for(int j=1; j<lowbit(i) ; j<<=1)
{
C[i]=max(C[i],C[i-j]);
}
}
}
void add(int pos ,int d)
{
A[pos]=d;
while(pos<=n)
{
C[pos]=max(C[pos],d);
pos+=lowbit(pos);
}
// for(int i=pos; i<=n; i+=lowbit(i))
// {
// C[i]=d;
// for(int j=1; j<lowbit(i); j<<=1)
// {
// C[i]=max(C[i],C[i-j]);
// }
// }
}
void query(int l, int r)
{
int ans=A[r];
while(1)
{
ans=max(ans,A[r]);
if(r==l)
break;
for(r=r-1; r-l>=lowbit(r); r-=lowbit(r))
{
ans=max(ans,C[r]);
}
}
printf("%d\n",ans);
}
int main()
{
int m , i ,l , r ;
char s ;
while (scanf("%d%d",&n,&m)!=EOF)
{
memset(C,0,sizeof(C));
for ( i = 1 ; i <= n ; i++ )
{
scanf ("%d", &A[i]);
}
init();
while(m--)
{
getchar();
scanf("%c",&s);
scanf("%d%d",&l,&r);
if(s == 'U')
{
add(l,r);
}
if( s == 'Q')
{
query(l,r);
}
}
}
return 0 ;
}