Cod sursa(job #3182821)

Utilizator Allie28Radu Alesia Allie28 Data 9 decembrie 2023 18:02:09
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <fstream>
#include <iostream>
#include <queue>
#include <cstring>
#include <vector>

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

const int LMAX = 30005;
int aint[LMAX*3], vec[LMAX], sol[LMAX], i, t, v, s;

int build(int nod, int st, int dr) {
    if (st == dr) {
        aint[nod] = vec[st];
        return aint[nod];
    }
    else {
        int mij = ((st + dr)>>1);
        aint[nod] = build(nod*2, st, mij) + build(nod*2 + 1, mij+1, dr);
        return aint[nod];
    }
}
int update(int nod, int st, int dr) {
    if (st == dr) {
        aint[nod] = aint[nod] - v;
        return aint[nod];
    }
    else {
        int mij = ((st + dr)>>1);
        if (t <= mij) {
            aint[nod] = update(2*nod, st, mij) + aint[nod*2 + 1];
        }
        else {
            aint[nod] = update(2*nod + 1, mij + 1, dr) + aint[nod*2];
        }
        return aint[nod];
    }
}
int query1(int nod, int st, int dr, int p, int q) {
    if (st == p && dr == q) {
        return aint[nod];
    }
    else {
        int mij = ((st + dr) >> 1);
        if (mij >= q) {
            return query1(nod*2, st, mij, p, q);

        }
        else if (mij < p) {
            return query1(nod*2 + 1, mij + 1, dr, p, q);

        }
        else {
            return query1(nod*2, st, mij, p, mij) + query1(nod*2 + 1, mij + 1, dr, mij+1, q);

        }
        //return s;
    }
}

int main() {
    int n, m;
    bool op;
    fin >> n >> m;
    for (i = 1; i <= n; i++) {
        fin >> vec[i];
    }
    build(1,1, n);
    while (m--) {
        fin >> op >> t >> v;
        if (op == 0) { //achitare
            update(1, 1, n);
            /*for (i = 1; i <= n * 3; i++) {
                fout << aint[i] << " " << i << endl;
            }
            fout << endl;*/
        }
        else {
            fout << query1(1, 1, n, t, v) << endl;
        }
    }





    fin.close();
    fout.close();

    return 0;
}