zoukankan      html  css  js  c++  java
  • 线段树 (单点修改,区间查询)

    https://www.luogu.com.cn/problem/P3374

    单点修改,区间查询,上代码

     1 #include<bits/stdc++.h> 
     2 #define N 500005
     3 #define endl '
    ' 
     4 #define _for(i,a,b) for(int i=a;i<b;i++)
     5 using namespace std;
     6 typedef long long ll; 
     7 ll a[N];
     8 struct Node{
     9     int L,R; ll Sum; 
    10 }T[N*4];
    11 void Build(int v,int L,int R){
    12     T[v].L=L,T[v].R=R;
    13     if( L==R ){
    14         T[v].Sum=a[R];
    15         return ;
    16     }
    17     int mid=(R+L)/2;
    18     Build( v*2,L,mid );
    19     Build( v*2+1,mid+1,R );
    20     T[v].Sum= T[v*2].Sum + T[v*2+1].Sum;
    21 }
    22 void Add(int v,int pos,int k){
    23     T[v].Sum+=k;
    24     if( T[v].L==T[v].R ) return ;
    25     if(pos<=T[v*2].R) Add( v*2,pos,k );
    26     else Add( v*2+1,pos,k );
    27 }
    28 ll Search(int v,int L,int R){
    29     if( T[v].L>=L && T[v].R<=R ){
    30         return T[v].Sum;
    31     }
    32     if( T[v].L>R || T[v].R<L ) return 0;
    33     ll res=0;
    34     if( T[v*2].R>=L ) res+=Search(v*2,L,R);
    35     if( T[v*2+1].L<=R ) res+=Search( v*2+1,L,R ); 
    36     return res;
    37 }
    38 int main(){    
    39     ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); 
    40     int n,m;   cin>>n>>m;
    41     _for(i,1,n+1) cin>>a[i];
    42     Build(1,1,n);
    43     while(m--){
    44         int b,c,d;
    45         cin>>b>>c>>d;
    46         if(b==1) Add(1,c,d); //a[c]+d;
    47         else cout<<Search(1,c,d)<<endl; //
    48     }
    49     return 0;
    50 } 
  • 相关阅读:
    微服务架构
    微服务架构
    Java语言编程
    Java语言编程
    Java语言编程
    《自己动手写云盘》 – 确立需求
    树上差分
    线性基
    BM(Berlekamp-Massey)算法
    FFT/FWT
  • 原文地址:https://www.cnblogs.com/SunChuangYu/p/12343674.html
Copyright © 2011-2022 走看看