Cod sursa(job #2064997)

Utilizator anisca22Ana Baltaretu anisca22 Data 13 noiembrie 2017 10:27:16
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <bits/stdc++.h>
#define NMAX 15005

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

int N, M, S;
int v[NMAX], ait[4 * NMAX];

void build(int poz, int st, int dr)
{
    if (st == dr)
    {
        ait[poz] = v[st];
        return;
    }
    int mij = (st + dr) / 2;
    build(poz * 2, st, mij);
    build(poz * 2 + 1, mij + 1, dr);
    ait[poz] = ait[poz * 2] + ait[poz * 2 + 1];
}

void upd(int poz, int act, int st, int dr)
{
    if (st == act)
    {
        ait[poz] = v[st];
        return;
    }
    if (st > act || dr < act)
        return;
    int mij = (st + dr) / 2;
    upd(poz * 2, act, st, mij);
    upd(poz * 2 + 1, act, mij + 1, dr);
    ait[poz] = ait[poz * 2] + ait[poz * 2 + 1];
}

void query(int poz, int lft, int rt, int st, int dr)
{
    if (st >= lft && dr <= rt)
    {
        S += ait[poz];
        return;
    }
    if (dr < lft || st > rt)
        return;
    int mij = (st + dr) / 2;
    query(poz * 2, lft, rt, st, mij);
    query(poz * 2 + 1, lft, rt, mij + 1, dr);
}

int main()
{
    fin >> N >> M;
    for (int i = 1; i <= N; i++)
        fin >> v[i];
    build(1, 1, N);
    for (int i = 1; i <= M; i++)
    {
        int op, x, y;

        fin >> op >> x >> y;
        if (op == 0) ///ziua x, valoare y
        {
            v[x] -= y;
            upd(1, x, 1, N);
        }
        else if (op == 1) ///start, end
        {
            S = 0;
            query(1, x, y, 1, N);
            fout << S << "\n";
        }
    }
    return 0;
}