Cod sursa(job #1753163)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 5 septembrie 2016 22:53:00
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>

using namespace std;

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

int AINT[4 * 15010], N, solution, op, p, q, v[15010], Q, T, V;

void build(int node, int left, int right, int position, int value)
{
    if(left == right)
    {
        AINT[node] = value;
        return;
    }

    int middle = (left + right) >> 1;

    if(position <= middle)
    {
        build(2 * node, left, middle, position, value);
    }
    else
    {
        build(2 * node + 1, middle + 1, right, position, value);
    }

    AINT[node] = AINT[2 * node] + AINT[2 * node + 1];
}
void update(int node, int left, int right, int position, int value)
{
    if(left == right)
    {
        AINT[node] -= value;
        return;
    }

    int middle = (left + right) >> 1;

    if(position <= middle)
    {
        update(2 * node, left, middle, position, value);
    }
    else
    {
        update(2 * node + 1, middle + 1, right, position, value);
    }

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

void query(int node,int left, int right, int a, int b)
{
    if(a <= left && right <= b)
    {
        solution += AINT[node];
        return;
    }

    int middle = (left + right) >> 1;

    if(a <= middle)
    {
        query(2 * node, left, middle, a, b);
    }
    if(b > middle)
    {
        query(2 * node + 1, middle + 1, right, a, b);
    }

}

int main()
{
    fin >> N >> Q;

    for(int i = 1; i <= N; i ++)
    {
        fin >> v[i];
        build(1, 1, N, i, v[i]);
    }

    for(int i = 1; i <= Q; i ++)
    {
        fin >> op;

        if(op == 0)
        {
            fin >> T >> V;
            update(1, 1, N, T, V);
        }
        else
        {
            solution = 0;
            fin >> p >> q;
            query(1, 1, N, p, q);
            fout << solution << '\n';
        }
    }

    return 0;
}