Cod sursa(job #1091641)

Utilizator A63N7pTudor Nazarie A63N7p Data 25 ianuarie 2014 21:24:03
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
using namespace std;

ifstream in;
ofstream out;

int dat[32768];

int query(int n, int left, int right, int a, int b);
void update(int n, int left, int right, int a, int b, int v);

int main(int argc, char *argv[])
{
    in.open("datorii.in");
    out.open("datorii.out");
    int n, m;
    in >> n >> m;

    for (int i = 0; i <= n; ++i) {
        int tmp;
        in >> tmp;
        update(1, 1, n, i, i, tmp);
    }

    for (int i = 0; i < m; ++i) {
        int a, b, c;
        in >> a >> b >> c;
        if (a) {
            int tmp = query(1, 1, n, b, c);
            out << tmp;
        } else
            update(1, 1, n, b, b, -c);
    }
    in.close();
    out.close();
    return 0;
}

int query(int n, int left, int right, int a, int b)
{
    if (a <= left && right <= b)
        return dat[n];
    int r = 0, middle = (left + right) / 2;
    if (a <= middle)
        r += query(2 * n, left, middle, a, b);
    if (b > middle)
        r += query(2 * n + 1, middle + 1, right, a, b);
    return r;
}

void update(int n, int left, int right, int a, int b, int v)
{
    if (a <= left && right <= b) {
        dat[n] += v;
        return;
    }
    int middle = (left + right) / 2;
    if (a <= middle)
        update(2 * n, left, middle, a, b, v);
    if (b > middle)
        update(2 * n + 1, middle + 1, right, a, b, v);
    dat[n] = dat[n * 2] + dat[n * 2 + 1];
}