Cod sursa(job #3207225)

Utilizator BledeaAlexBledea Alexandru BledeaAlex Data 25 februarie 2024 15:33:02
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("datorii.in");
ofstream g("datorii.out");

const int N_MAX = 15001, A_MAX = 60004; /// = 4 * N_MAX
int N, M;
int poz, val, start, finish;
int v[N_MAX], a[A_MAX];

void build(int nod, int l, int r){
    if(l == r){
        a[nod] = v[l];
        return;
    }
    int m = (l + r) / 2;
    build(2 * nod, l, m);
    build(2 * nod + 1, m + 1, r);
    a[nod] = a[2 * nod] + a[2 * nod + 1];
}

void Update(int nod, int l, int r){
    a[nod] -= val;
    if(l == r){
        return;
    }
    int m = (l + r) / 2;
    if(poz <= m)
        Update(2 * nod, l, m);
    else
        Update(2 * nod + 1, m + 1, r);
}

int Query(int nod, int l, int r){
    if(start <= l && r <= finish)
        return a[nod];
    int m = (l + r) / 2, sum = 0;
    if(start <= m)
        sum += Query(2 * nod, l, m);
    if(finish > m)
        sum += Query(2 * nod + 1, m + 1, r);
    return sum;
}

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

    for(int i = 1; i <= N; ++i)
        f >> v[i];

    build(1, 1, N);

    for(int i = 0, c, x, y; i < M; ++i){
        f >> c >> x >> y;
        switch(c){
            case 0:
                poz = x, val = y;
                Update(1, 1, N);
                break;
            case 1:
                start = x, finish = y;
                g << Query(1, 1, N) << '\n';
                break;
        }
    }

    return 0;
}