Cod sursa(job #3151369)

Utilizator patrick_burasanPatrick Burasan patrick_burasan Data 20 septembrie 2023 21:49:22
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>

using namespace std;

ifstream cin("datorii.in");
ofstream cout("datorii.out");

const int NMAX = 15005;
int n, m, t, a, b, arr[NMAX], tree[4 * NMAX];

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

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

    Build(2 * node, left, mid);
    Build(2 * node + 1, mid + 1, right);

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

void Update(int node, int left, int right, int pos, int delta)
{
    if (left == right)
    {
        tree[node] = max(0, tree[node] - delta);
        return;
    }

    if (pos > right || pos < left) return;

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

    if (pos <= mid)
        Update(2 * node, left, mid, pos, delta);
    else
        Update(2 * node + 1, mid + 1, right, pos, delta);

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

int Query(int node, int left, int right, int x, int y)
{
    if (x <= left && right <= y) return tree[node];
    if (x > right || y < left)   return 0;

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

    return Query(2 * node, left, mid, x, y) +
           Query(2 * node + 1, mid + 1, right, x, y);
}

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> arr[i];
    Build(1, 1, n);
    while (m--)
    {
        cin >> t >> a >> b;
        if (t == 0)
            Update(1, 1, n, a, b);
        else
            cout << Query(1, 1, n, a, b) << '\n';
    }
    cin.close();
    cout.close();
    return 0;
}