Cod sursa(job #2157171)

Utilizator vasi461Vasiliu Dragos vasi461 Data 9 martie 2018 12:50:16
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
using namespace std;

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

#define MAX 15005

int n, m, v[MAX], o, x, y, aint[4 * MAX], q;

void arbore(int k, int a, int b)
{
    if(a == b)
    {
        aint[k] = v[a];
        return;
    }
    int mij = (a + b) / 2;
    arbore(2 * k, a, mij);
    arbore(2 * k + 1, mij + 1, b);
    aint[k] = aint[2 * k] + aint[2 * k + 1];
}

void query(int k, int a, int b)
{
    if(a >= x and b <= y)
    { 
        q += aint[k];
        return;
    }
    int mij = (a + b) / 2;
    if(x <= mij)
    {
        query(2 * k, a, mij);
    }
    if(y > mij)
    {
        query(2 * k + 1, mij + 1, b);
    }
    aint[k] = aint[2 * k] + aint[2 * k + 1];
}

void update(int k, int a, int b)
{
    if(b == a)
    {
        aint[k] -= y;
        return;
    }
    int mij = (a + b) / 2;
    if(x <= mij)
    {
        update(2 * k, a, mij);
    }
    else
    {
        update(2 * k + 1, mij + 1, b);
    }
    aint[k] = aint[2 * k] + aint[2 * k + 1];
}

int main()
{
    cin.sync_with_stdio(false);
    cin >> n >> m;
    for(int i = 1; i <= n; ++i)
    {
        cin >> v[i];
    }
    arbore(1, 1, n);
    for(int i = 1; i <= m; ++i)
    {
        cin >> o >> x >> y;
        if(o == 0)
        {
            update(1, 1, n);
        }
        else
        {
            q = 0;
            query(1, 1, n);
            cout << q << '\n';
        }
    }
    return 0;
}