Cod sursa(job #2516170)

Utilizator OvidRata Ovidiu Ovid Data 30 decembrie 2019 15:39:30
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define sc second
#define ft first
ifstream fin("arbint.in"); ofstream fout("arbint.out");



int A[15010], N, M;
int a,b;
int T[60010];


long long construct(int l, int r, int nod){
    
    if(r==l){T[nod]=A[r];}
    else{int mij=l+r; mij/=2;
        T[nod]=construct(l, mij, nod*2)+construct(mij+1, r, 2*nod+1);}

     return T[nod];
} 




int sum(int n, int al, int ar, int l, int r){
    if(l>r){return 0;}
    
    if(al==l && ar==r){return T[n];}
    
    int mij=ar+al; mij/=2;
    return sum(2*n, al, mij, l, min(mij,r))+sum(2*n+1, mij+1, ar, max(l, mij+1), r) ;
}





void update(int n, int al, int ar, int p, int v){
    if(ar==al){T[n]-=v;}
    else{
    int mij=ar+al; mij/=2;
    
    if(p<=mij){
        update(2*n, al, mij, p, v);
    }
    else{
        update(2*n+1, mij+1, ar, p, v);
    }
    T[n]=T[2*n]+T[2*n+1];
    }
    
}





int main() {
fin>>N>>M;

for(int i=1; i<=N; i++){
    fin>>A[i];
}

construct(1, N, 1);
bool o;
for(;M;M--){
fin>>o;
if(!o){fin>>a>>b; update(1, 1, N, a, b);}
else{fin>>a>>b;
fout<<sum(1, 1, N, a, b)<<"\n";
}

}


}