Cod sursa(job #2310748)

Utilizator maria15Maria Dinca maria15 Data 1 ianuarie 2019 22:41:22
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>

using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");

int n, m, i, a[60001], v[15001], sol, x, y, cod;

void build(int nod, int st, int dr){
    if(st == dr){
        a[nod] = v[st];
        return;
    }
    int mid = (st+dr)/2;
    build(2*nod, st, mid);
    build(2*nod+1, mid+1, dr);
    a[nod] = a[2*nod] + a[2*nod+1];
}

void update(int nod, int st, int dr){
    if(st == dr){
        a[nod] -= y;
        return;
    }
    int mid = (st+dr)/2;
    if(mid <= x)
        update(2*nod, st, mid);
    else
        update(2*nod+1, mid+1, dr);
    a[nod] = a[2*nod] + a[2*nod+1];
}

void query(int nod, int st, int dr){
    if(x <= st && dr <= y){
        sol += a[nod];
        return;
    }
    int mid = (st+dr)/2;
    if(x <= mid)
        query(2*nod, st, mid);
    if(y > mid)
        query(2*nod+1, mid+1, dr);
}

int main(){
    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>v[i];
    build(1, 1, n);
    while(m--){
        fin>>cod>>x>>y;
        if(cod == 0)
            update(1, 1, n);
        else{
            sol = 0;
            query(1, 1, n);
            fout<<sol<<"\n";
        }
    }
    return 0;
}