spoj 1716. Can you answer these queries III

spoj 1716. Can you answer these queries III

#include < iostream >
using   namespace  std;

typedef 
struct {
    
int  l,r;
    
int  sum;
    
int  value;
    
int  lvalue;
    
int  rvalue;
}Node;
Node tree[
250000 ];
inline 
int  max( int  a, int  b){
    
if (a > b)  return  a;
    
else   return  b;
}
void  build( int  Num, int  l, int  r){
    tree[Num].l
= l;
    tree[Num].r
= r;
    tree[Num].value
= 0 ;
    
if (l < r){
        
int  mid = (l + r) >> 1 ;
        build(Num
* 2 ,l,mid);
        build(Num
* 2 + 1 ,mid + 1 ,r);
    }
}
void  modify( int  Num){
    tree[Num].sum
= tree[Num * 2 ].sum + tree[Num * 2 + 1 ].sum;   // 区间的总和
    tree[Num].lvalue = max(tree[Num * 2 ].lvalue,tree[Num * 2 ].sum + tree[Num * 2 + 1 ].lvalue);
    
// 左边的最大值=左孩子左边的值,或者左孩子的总和加右孩子左边的值(即通过中间点)
    tree[Num].rvalue = max(tree[Num * 2 + 1 ].rvalue,tree[Num * 2 + 1 ].sum + tree[Num * 2 ].rvalue);
    
// 右边的最大值=右孩子右边的值,或者右孩子的综合加左孩子右边的值(即通过中间点)
    tree[Num].value = tree[Num * 2 ].rvalue + tree[Num * 2 + 1 ].lvalue;
    
// 父亲的最大值=左孩子右边的值加上右孩子左边的值(即通过中间点)
    tree[Num].value = max(tree[Num].value,tree[Num * 2 ].value);
    
// 可能只在左边
    tree[Num].value = max(tree[Num].value,tree[Num * 2 + 1 ].value);
    
// 可能只在右边
}
void  insert( int  Num, int  r, int  value){
    
if (tree[Num].l == tree[Num].r){
        tree[Num].sum
= value;
        tree[Num].value
= value;
        tree[Num].lvalue
= value;
        tree[Num].rvalue
= value;
        
return  ;
    }
    
int  mid = (tree[Num].l + tree[Num].r) >> 1 ;
    
if (r <= mid) insert(Num * 2 ,r,value);
    
else  insert(Num * 2 + 1 ,r,value);
    modify(Num);
}
Node query(
int  Num, int  l, int  r){
    
if (l == tree[Num].l && r == tree[Num].r)
        
return  tree[Num];
    
int  mid = (tree[Num].l + tree[Num].r) >> 1 ;
    
if (r <= mid)  return  query(Num * 2 ,l,r);
    
else   if (l > mid)  return  query(Num * 2 + 1 ,l,r);
    
else {
        Node lt
= query(Num * 2 ,l,mid);
        Node rt
= query(Num * 2 + 1 ,mid + 1 ,r);
        Node tmp;
        tmp.sum
= lt.sum + rt.sum;
        tmp.lvalue
= max(lt.lvalue,lt.sum + rt.lvalue);
        tmp.rvalue
= max(rt.rvalue,rt.sum + lt.rvalue);
        tmp.value
= lt.rvalue + rt.lvalue;
        tmp.value
= max(tmp.value,lt.value);
        tmp.value
= max(tmp.value,rt.value);
        
return  tmp;
    }
}
int  main()
{
    
int  n,m,x,y,z;
    scanf(
" %d " , & n);
    build(
1 , 1 ,n);
    
for ( int  i = 1 ;i <= n; ++ i){
        scanf(
" %d " , & x);
        insert(
1 ,i,x);
    }
    scanf(
" %d " , & m);
    
for ( int  i = 1 ;i <= m; ++ i){
        scanf(
" %d%d%d " , & z, & x, & y);
        
if (z)
            printf(
" %d\n " ,query( 1 ,x,y).value);
        
else  insert( 1 ,x,y);
    }
    
return   0 ;
}


vijos1083,虽然一样的题目,但是orz出题的人~~~,还是贴出来吧!
#include < iostream >
using   namespace  std;

struct  Node{
    
int  l,r;
    
int  sum;
    
int  value;
    
int  lvalue,rvalue;
};
Node tree[
2100000 ];
int  A[ 500010 ];
inline 
int  max( int  a, int  b){
    
return  a > b ? a:b;
}
void  modfiy( int  Num){
    tree[Num].sum
= tree[Num * 2 ].sum + tree[Num * 2 + 1 ].sum;
    tree[Num].lvalue
= max(tree[Num * 2 ].lvalue,tree[Num * 2 ].sum + tree[Num * 2 + 1 ].lvalue);
    tree[Num].rvalue
= max(tree[Num * 2 + 1 ].rvalue,tree[Num * 2 + 1 ].sum + tree[Num * 2 ].rvalue);
    tree[Num].value
= tree[Num * 2 ].rvalue + tree[Num * 2 + 1 ].lvalue;
    tree[Num].value
= max(tree[Num].value,tree[Num * 2 ].value);
    tree[Num].value
= max(tree[Num].value,tree[Num * 2 + 1 ].value);
}
void  build( int  Num, int  l, int  r){
    tree[Num].l
= l;
    tree[Num].r
= r;
    
if (l < r){
        
int  mid = (l + r) >> 1 ;
        build(Num
* 2 ,l,mid);
        build(Num
* 2 + 1 ,mid + 1 ,r);
        modfiy(Num);
    }
    
else {
        tree[Num].sum
= A[r];
        tree[Num].value
= A[r];
        tree[Num].lvalue
= A[r];
        tree[Num].rvalue
= A[r];
    }
}
void  insert( int  Num, int  r, int  value){
    
if (tree[Num].l == tree[Num].r){
        tree[Num].sum
= value;
        tree[Num].value
= value;
        tree[Num].lvalue
= value;
        tree[Num].rvalue
= value;
        
return ;
    }
    
int  mid = (tree[Num].l + tree[Num].r) >> 1 ;
    
if (r <= mid) insert(Num * 2 ,r,value);
    
else  insert(Num * 2 + 1 ,r,value);
    modfiy(Num);
}
Node query(
int  Num, int  l, int  r){
    
if (l == tree[Num].l && r == tree[Num].r)
        
return  tree[Num];
    
int  mid = (tree[Num].l + tree[Num].r) >> 1 ;
    
if (r <= mid)  return  query(Num * 2 ,l,r);
    
else   if (l > mid)  return  query(Num * 2 + 1 ,l,r);
    
else {
        Node lt
= query(Num * 2 ,l,mid);
        Node rt
= query(Num * 2 + 1 ,mid + 1 ,r);
        Node tmp;
        tmp.sum
= lt.sum + rt.sum;
        tmp.lvalue
= max(lt.lvalue,lt.sum + rt.lvalue);
        tmp.rvalue
= max(rt.rvalue,rt.sum + lt.rvalue);
        tmp.value
= lt.rvalue + rt.lvalue;
        tmp.value
= max(tmp.value,lt.value);
        tmp.value
= max(tmp.value,rt.value);
        
return  tmp;
    }
}
int  main()
{
    
int  n,m;
    
int  x,y,z;
    scanf(
" %d%d " , & n, & m);
    
for ( int  i = 1 ;i <= n; ++ i)
        scanf(
" %d " , & A[i]);
    build(
1 , 1 ,n);
    
for ( int  i = 1 ;i <= m; ++ i){
        scanf(
" %d%d%d " , & z, & x, & y);
        
if (z == 1 ){
            
if (x > y){
                
int  tmp = x;
                x
= y;y = tmp;
            }
            
int  ans = query( 1 ,x,y).value;
            printf(
" %d  " ,ans);
        }
        
else
            insert(
1 ,x,y);
    }
    
return   0 ;
}


你可能感兴趣的:(spoj 1716. Can you answer these queries III)