• 点修改区间查询 HDU1166


     1 #include <iostream>
     2 #include <cstdio>
     3 
     4 using namespace std;
     5 
     6 int an[50010];
     7 struct Node
     8 {
     9     int l,r;
    10     int v;
    11 }bn[200000];
    12 
    13 void build(int k,int l,int r)
    14 {
    15     bn[k].l=l;
    16     bn[k].r=r;
    17     if(l==r)
    18     {
    19         bn[k].v=an[l];
    20         return ;
    21     }
    22     int lk=k*2;
    23     int rk=lk+1;
    24     int mid=(l+r)/2;
    25     build(lk,l,mid);
    26     build(rk,mid+1,r);
    27     bn[k].v=bn[lk].v+bn[rk].v;
    28 }
    29 
    30 void change(int k,int i,int a)
    31 {
    32     if(bn[k].l==i&&bn[k].r==i)
    33     {
    34         bn[k].v+=a;
    35         return ;
    36     }
    37     int lk=k*2;
    38     int rk=lk+1;
    39     if(i<=bn[lk].r)
    40         change(lk,i,a);
    41     else if(i>bn[k].l)
    42         change(rk,i,a);
    43     bn[k].v=bn[lk].v+bn[rk].v;
    44 }
    45 
    46 int search(int k,int l,int r)
    47 {
    48     if(bn[k].l==l&&bn[k].r==r)
    49         return bn[k].v;
    50     int lk=k*2;
    51     int rk=lk+1;
    52     if(bn[lk].r>=r)
    53         search(lk,l,r);
    54     else if(bn[rk].l<=l)
    55         search(rk,l,r);
    56     else
    57         return search(lk,l,bn[lk].r)+search(rk,bn[rk].l,r);
    58 }
    59 
    60 int main()
    61 {
    62     int t;
    63     cin>>t;
    64     for(int l=1;l<=t;l++)
    65     {
    66         cout<<"Case "<<l<<":"<<endl;
    67         int n;
    68         scanf("%d",&n);
    69         for(int i=1;i<=n;i++)
    70             scanf("%d",&an[i]);
    71         build(1,1,n);
    72         char str[10];
    73         int a,b;
    74         while(scanf("%s",str)!=EOF)
    75         {
    76             if(str[0]=='E')
    77                 break;
    78             scanf("%d%d",&a,&b);
    79             if(str[0]=='Q')
    80             {
    81                 cout<<search(1,a,b)<<endl;
    82             }
    83             else if(str[0]=='A')
    84             {
    85                 change(1,a,b);
    86             }
    87             else if(str[0]=='S')
    88             {
    89                 change(1,a,-b);
    90             }
    91         }
    92     }
    93     return 0;
    94 }
    View Code
  • 相关阅读:
    a和b互换的2种方式
    spring cloud 方法调用 feign
    spring boot redis 五种类型使用实例
    springboot引入properties文件 yml文件
    Spark-Streaming结合Redis
    Spark-Streaming结合Mysql案例
    Springboot与scala编写第一个web程序
    Springboot工程Mybatis二级缓存配置
    小奇画画
    saf
  • 原文地址:https://www.cnblogs.com/wsruning/p/4691384.html
Copyright © 2020-2023  润新知