Cod sursa(job #2752765)

Utilizator alexbrinzaAlexandru Brinza alexbrinza Data 19 mai 2021 15:50:08
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <iostream>
#include <fstream>
using namespace std;

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

int n, m, x, y, task;

class arbint{

    const static int MAX = 15005;
    int tree[4 * MAX];
    int v[MAX];

public:

    void add_vector(int val, int pos)
    {
        v[pos] = val;
    }

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

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

        build(node * 2, left, middle);
        build(node * 2 + 1, middle + 1, right);

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

    void update(int node, int left, int right, int pos, int val)
    {
        if(left == right)
        {
            tree[node] -= val;
            return;
        }

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

        if(pos <= middle) update(node * 2, left, middle, pos, val);
        else update(node * 2 + 1, middle + 1, right, pos, val);

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

    int query(int node, int left, int right, int x, int y)
    {
        if(x <= left && right <= y)
            return tree[node];

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

        if(y <= middle) return query(node * 2, left, middle, x, y);
        if(middle < x) return query(node * 2 + 1, middle + 1, right, x, y);

        int sum_st = query(node * 2, left, middle, x, y);
        int sum_dr = query(node * 2 + 1, middle + 1, right, x, y);

        return sum_st + sum_dr;
    }
};

arbint A;

void read()
{
    in >> n >> m;

    for(int i = 1; i <= n; ++i)
    {
        in >> x;
        A.add_vector(x, i);
    }

    A.build(1, 1, n);

    for(int i = 1; i <= m; ++i)
    {
        in >> task >> x >> y;

        if(task == 0) A.update(1, 1, n, x, y);
        else out << A.query(1, 1, n, x, y) << "\n";
    }

}

int main()
{
    read();
    return 0;
}