Cod sursa(job #2160128)

Utilizator raul044Moldovan Raul raul044 Data 11 martie 2018 11:48:04
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <iostream>
#include <fstream>
#define maxN 15001

using namespace std;

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

int n, m, sum;
int ARB[4*maxN+66];

void Update (int nod, int left, int right, int val, int poz) {
    if (left == right) {
        if (ARB[nod] + val >=0)
            ARB[nod] += val;
        else
            ARB[nod] = val;
        return;
    }
    int mid = (left+right)/2;
    if (poz <= mid)
        Update(2*nod, left, mid, val, poz);
    else
        Update(2*nod+1, mid+1, right, val, poz);
    ARB[nod] = ARB[2*nod] + ARB[2*nod+1];
}

void Query (int nod, int left, int right, int a, int b) {
    if (a<=left and right <= b) {
        sum += ARB[nod];
        return;
    }
    else {
        int mid = (left+right)/2;
        if (a <= mid)
            Query(2*nod, left, mid, a, b);
        if (b > mid)
            Query(2*nod+1, mid+1, right, a, b);
    }
}

int main () {
    fin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        int val;
        fin >> val;
        Update(1, 1, n, val, i);
    }
    for (int i = 1; i <= m; ++i) {
        int Q;
        fin >> Q;
        if (Q == 0) {
            int dat, poz;
            fin >> poz >> dat;
            Update(1, 1, n, -dat, poz);
        }
        else {
            int a, b;
            sum = 0;
            fin >> a >> b;
            Query(1, 1, n, a, b);

            fout << sum << '\n';
        }

    }

}