Cod sursa(job #3221255)

Utilizator stefanvilcescuStefan Vilcescu stefanvilcescu Data 6 aprilie 2024 13:28:45
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;
const int MAXN=15000;

int sir[MAXN];
int aint[4*MAXN];

void init(int st, int dr, int node){
    if(st==dr){
        aint[node]=sir[st];
        return;
    }
    int mij=(st+dr)/2;
    init(st, mij, 2*node+1);
    init(mij+1, dr, 2*node+2);
    aint[node]=aint[2*node+1]+aint[2*node+2];
}

void update(int st, int dr, int node, int poz, int val){
    if(st>poz || dr<poz)
        return;
    if(st==dr){
        aint[node]-=val;
        return;
    }
    int mij=(st+dr)/2;
    if(mij>=poz)
        update(st, mij, 2*node+1, poz, val);
    else
        update(mij+1, dr, 2*node+2, poz, val);
    aint[node]=aint[2*node+1]+aint[2*node+2];
}

int query(int st, int dr, int node, int l, int r){
    if(st>r || dr<l)
        return 0;
    if(l<=st && dr<=r)
        return aint[node];
    int mij=(st+dr)/2;
    return query(st, mij, 2*node+1, l, r)+query(mij+1, dr, 2*node+2, l, r);
}

int main(){
    ifstream cin("datorii.in");
    ofstream cout("datorii.out");
    int n, q, i, tip, l, r;
    cin>>n>>q;
    for(i=0; i<n; i++)
        cin>>sir[i];
    init(0, n-1, 0);
    for(i=0; i<q; i++){
        cin>>tip>>l>>r;
        if(tip==0)
            update(0, n-1, 0, l-1, r);
        else
            cout<<query(0, n-1, 0, l-1, r-1)<<"\n";
    }
    return 0;
}