Cod sursa(job #2756264)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 30 mai 2021 15:02:43
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 kb
/*
    Vreau sa am o cutie neagra careia ii dau update-uri si query-uri de genul: care este suma pe un anumit interval
    Pt ca e suma, pot sa fac ceva de genul sume partiale, cu AIB-uri
    Dar momentan implementez cu arbori de intervale, dupa cu AIB-uri
*/

#include <iostream>
#include <fstream>

#define NMAX 15000

using namespace std;

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

int tip, a, b;
int tree[4 * NMAX + 1];
int v[NMAX + 1];

void buildArbore(int node, int left, int right){
    if(left == right){
        tree[node] = v[left];
        return;
    }

    int mid = left + (right - left) / 2;
    buildArbore(node * 2, left, mid);
    buildArbore(node * 2 + 1, mid + 1, right);

    tree[node] = tree[node * 2] + tree[node * 2 + 1];
}

void update(int node, int left, int right){
    if(left == right){ //left = a
        tree[node] -= b;
        return;
    }

    int mid = left + (right - left) / 2;

    if(a <= mid){
        update(node * 2, left, mid);
    }
    else {
        update(node * 2, mid + 1, right);
    }

    tree[node] = tree[node * 2] + tree[node * 2 + 1];
}

int query(int node, int left, int right){
    if(a <= left && right <= b){
        return tree[node];
    }

    int mid = left + (right - left) / 2;

    int rez1 = 0, rez2 = 0;
    if(mid >= a){
        rez1 = query(node * 2, left, mid);
    }
    if(mid + 1 <= b){
        rez2 = query(node * 2 + 1, mid + 1, right);
    }

    return rez1 + rez2;
}

int main()
{
    int N, M;
    fin >> N >> M;

    for(int i = 1; i <= N; i++){
        fin >> v[i];
    }
    buildArbore(1, 1, N); //dupa asta nici macar nu mai am nevoie de v[]

    delete v;

    for(int q = 1; q <= M; q++){
        fin >> tip >> a >> b; //variabile globale

        if(tip == 0){
            //update
            //vreau sa sterg b din ziua numarul a
            update(1, 1, N);
        }
        else {
            //vreau sa stiu un query de suma pe un interval
            fout << query(1, 1, N) << "\n";
        }
    }

    return 0;
}