zoukankan      html  css  js  c++  java
  • spoj 1716 Can you answer these queries III

    http://www.spoj.com/problems/GSS3/

    My Code
     1 #include <cstdio>
     2 #include <algorithm>
     3 using namespace std;
     4 #define lson l,m,rt<<1
     5 #define rson m+1,r,rt<<1|1
     6 #define maxn 50001
     7 struct node
     8 {
     9     int lmax,rmax,max,sum;
    10 }setree[maxn<<2];
    11 int ans;
    12 void pushup(int rt)
    13 {
    14     setree[rt].lmax=max(setree[rt<<1].lmax,setree[rt<<1].sum+setree[rt<<1|1].lmax);
    15     setree[rt].rmax=max(setree[rt<<1|1].rmax,setree[rt<<1|1].sum+setree[rt<<1].rmax);
    16     setree[rt].sum=setree[rt<<1].sum+setree[rt<<1|1].sum;
    17     setree[rt].max=max(setree[rt<<1].max,setree[rt<<1|1].max);
    18     setree[rt].max=max(setree[rt].max,setree[rt<<1].rmax+setree[rt<<1|1].lmax);
    19 }
    20 void build(int l,int r,int rt)
    21 {
    22     if(l==r){
    23         scanf("%d",&setree[rt].sum);
    24         setree[rt].lmax=setree[rt].rmax=setree[rt].max=setree[rt].sum;
    25         return;
    26     }
    27     int m=(l+r)>>1;
    28     build(lson);
    29     build(rson);
    30     pushup(rt);
    31 }
    32 void update(int l,int r,int rt,int num,int c)
    33 {
    34     if(l==r){
    35         setree[rt].lmax=setree[rt].rmax=setree[rt].max=setree[rt].sum=c;
    36         return;
    37     }
    38     int m=(l+r)>>1;
    39     if(num<=m)
    40     update(lson,num,c);
    41     else
    42     update(rson,num,c);
    43     pushup(rt);
    44 }
    45 int query(int l,int r,int rt,int flag,int L,int R)
    46 {
    47     if(L==l&&r==R){
    48         ans=max(ans,setree[rt].max);
    49         return flag==-1?setree[rt].lmax:setree[rt].rmax;
    50     }
    51     int m=(l+r)>>1;
    52     if(R<=m)
    53     return query(lson,-1,L,R);
    54     else if(L>m)
    55     return query(rson,1,L,R);
    56     else{
    57         int ln=query(lson,1,L,m);
    58         int rn=query(rson,-1,m+1,R);
    59         ans=max(ans,ln+rn);
    60         if(flag==-1)
    61         return max(setree[rt<<1].lmax,setree[rt<<1].sum+rn);
    62         else
    63         return max(setree[rt<<1|1].rmax,setree[rt<<1|1].sum+ln);
    64     }
    65 }
    66 int main()
    67 {
    68     int n;
    69     while(~scanf("%d",&n)){
    70         build(1,n,1);
    71         int m;
    72         scanf("%d",&m);
    73         while(m--){
    74             int op,a,b;
    75             scanf("%d%d%d",&op,&a,&b);
    76             if(op==0)
    77             update(1,n,1,a,b);
    78             else{
    79                 ans=-(1<<30);
    80                 query(1,n,1,0,a,b);
    81                 printf("%d\n",ans);
    82             }
    83         }
    84     }
    85     return 0;
    86 }
  • 相关阅读:
    转载别人(ZZ)创建要素集
    CAD转化为Shp
    VBS学习
    3度带/6度带
    头文件学习,GEOTIFF
    arcmap vba 生成3维侧棱 以及 createfeature与createfeaturebuffer的区别
    另类
    幸福人生讲座(七):怎样引导孩子立志
    幸福人生讲座(四):孝道与仁爱是根本
    幸福人生讲座(二):人生怎样才能幸福?
  • 原文地址:https://www.cnblogs.com/kim888168/p/2917820.html
Copyright © 2011-2022 走看看