Cod sursa(job #2428580)

Utilizator topala.andreiTopala Andrei topala.andrei Data 5 iunie 2019 20:27:51
Problema Datorii Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <iostream>
#include <fstream>
#define MAXN 15001
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int arbInt[4 * MAXN];
int querryAns = 0;
void update(int node, int pos, int value, int left, int right) {
    if (left == right) {
        arbInt[node] += value;
        return;
    }
    int mid = (left + right) / 2;
    if (pos <= mid) {
        update(2 * node, pos, value, left, mid);
    } else {
        update(2 * node + 1, pos, value, mid + 1, right);
    }
    arbInt[node] = arbInt[2 * node] + arbInt[2 * node + 1];
}
void querry(int node, int left, int right, int start, int finish) {
    if (start <= left && right <= finish) {
        querryAns += arbInt[node];
        return;
    }
    int mid = (left + right) / 2;
    if (start <= mid) {
        querry(2 * node, left, mid, start, finish);
    }
    if (mid < finish) {
        querry(2 * node + 1, mid + 1, right, start, finish);
    }
}
int main()
{
    int N, M, debt, op;
    f >> N >> M;
    for (int i = 1; i <= N; ++i) {
        f >> debt;
        update(1, i, debt, 1, N);
    }
    for (int i = 1; i <= M; ++i) {
        f >> op;
        if (op == 0) {
            int cash, day;
            f >> day >> cash;
            update(1, day, -cash, 1, N);
        } else {
            int startDay, finishDay;
            f >> startDay >> finishDay;
            querryAns = 0;
            querry(1, 1, N, startDay, finishDay);
            g << querryAns << '\n';
        }
    }
    return 0;
}