Cod sursa(job #3352731)

Utilizator TraianQTraianQ TraianQ Data 30 aprilie 2026 23:03:02
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#define N 15001
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int v[N * 4];
void build(int poz, int st, int dr) {
    if(st==dr) {
        fin>>v[poz];
        return;
    }
    int mij = (st+dr)/2;
    build(poz * 2, st, mij);
    build(poz * 2 + 1, mij+1, dr);
    v[poz] = v[poz * 2] + v[poz * 2 + 1];
}
void update(int n, int searchedPos, int st, int dr, int idx, int decreaseBy) {
    if(st==dr) {
        v[idx] -= decreaseBy;
        return;
    }
    int mij = (st+dr)/2;
    if(searchedPos<=mij)
        update(n, searchedPos, st, mij, idx * 2, decreaseBy);
    else
        update(n, searchedPos, mij + 1, dr, idx * 2 + 1, decreaseBy);
    v[idx] = v[idx * 2] + v[idx * 2 + 1];
}

int query(int n, int poz, int st, int dr, int queryL, int queryR) {
    if(dr < queryL || st > queryR)
        return 0;
    if(st>dr)
        return 0;
    if(queryL<=st && dr<=queryR)
        return v[poz];
    int mij = (st + dr)/2;
    int s = 0;
    s += query(n, poz * 2, st, mij, queryL, queryR);
    s += query(n, poz * 2+1, mij+1, dr, queryL, queryR);
    return s;
}
int main()
{
    int n, m, q, a, b;
    fin>>n>>m;
    build(1, 1, n);
    for(int i = 1; i <= m; i++) {
        fin>>q>>a>>b;
        if(q==0) {
            update(n, a, 1, n, 1, b);
        }
        else {
            fout<<query(n, 1, 1, n, a, b)<<'\n';
        }
    }
    fin.close();
    fout.close();
    return 0;
}