Cod sursa(job #2625585)

Utilizator ihorvaldsTudor Croitoru ihorvalds Data 6 iunie 2020 01:09:50
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

void build_tree(std::vector<int>& a, std::vector<int>& values, int index, int int_left, int int_right) {
    if (int_left == int_right) {
        a[index - 1] = values[int_left];
        return;
    }

    int mid = (int_left + int_right) / 2;
    build_tree(a, values, 2 * index, int_left, mid);
    build_tree(a, values, 2 * index + 1, mid + 1, int_right);

    a[index - 1] = a[2 * index] + a[2 * index - 1];
}

void update_payments(std::vector<int>& a, int tree_pos, int index, int int_left, int int_right, int amount) {
    if (int_left == int_right) {
        a[tree_pos - 1] -= amount;
        return;
    }

    int mid = (int_left + int_right) / 2;
    if (index <= mid) {
        update_payments(a, tree_pos * 2, index, int_left, mid, amount);
    }
    else {
        update_payments(a, tree_pos * 2 + 1, index, mid + 1, int_right, amount);
    }

    a[tree_pos - 1] = a[tree_pos * 2] + a[tree_pos * 2 - 1];
}

int sum(std::vector<int>& a, int tree_pos, int int_left, int int_right, int start_date, int end_date) {
    if (start_date == int_left && end_date == int_right) {
        return a[tree_pos - 1];
    }

    int mid = (int_left + int_right) / 2;

    if (end_date <= mid) {
        return sum(a, tree_pos * 2, int_left, mid, start_date, end_date);
    }
    else if (start_date > mid) {
        return sum(a, tree_pos * 2 + 1, mid + 1, int_right, start_date, end_date);
    }

    return sum(a, tree_pos * 2, int_left, mid, start_date, mid) +
        sum(a, tree_pos * 2 + 1, mid + 1, int_right, mid + 1, end_date);
}

int main()
{
    std::ifstream f("datorii.in");
    std::ifstream g("datorii.out");

    int n;
    long m;

    f >> n >> m;
    std::vector<int> v(n, 0), a(100000, 0);
    for (int i = 0; i < n; i++)
        f >> v[i];

    build_tree(a, v, 1, 0, n - 1);
    
    int op, t, q;
    for (long i = 0; i < m; i++) {
        f >> op >> t >> q;
        if (!op) {
            update_payments(a, 1, t - 1, 0, n - 1, q);
        }
        else {
            g << sum(a, 1, 0, n - 1, t - 1, q - 1) << "\n";
        }
    }
}