Cod sursa(job #3041362)

Utilizator Mihai01_MMihai Moise Mihai01_M Data 31 martie 2023 13:04:07
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>

using namespace std;

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




int v[100005], aint[100005];

void init (int l, int r, int nod)
{
    if (l == r)
    {
        aint[nod] = v[l];
        return;
    }
    int m = (l + r) / 2;
    init(l, m, 2 * nod);
    init(m + 1, r, 2 * nod + 1);
    aint[nod] = aint[2 * nod]+ aint[2 * nod + 1];
}

void upd (int l, int r, int poz, int val, int nod)
{
    if (l == r)
    {
        aint[nod]+= val;
        return;
    }
    int m = (l + r) / 2;
    if (poz <= m)
    {
        upd(l, m, poz, val, 2 * nod);
    }
    else
    {
        upd(m + 1, r, poz, val, 2 * nod + 1);
    }
    aint[nod] = aint[2 * nod]+aint[2 * nod + 1];
}

int qry (int l, int r, int st, int dr, int nod)
{
    if (st <= l && r <= dr)
    {
        return aint[nod];
    }
    int m = (l + r) / 2;
    if (st <= m)
    {
        if(dr>m) return qry(l, m, st, dr, 2 * nod)+qry(m+1, r, st, dr, 2 * nod+1);
        else
            return qry(l, m, st, dr, 2 * nod);
    }
    else
        return qry(m+1, r, st, dr, 2 * nod+1);
}

int main ()
{
    int n, m;
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        fin >> v[i];
    }
    init(1, n, 1);
    for(int i=1;i<=m;i++)
    {
        int op, x, y;
        fin >> op >> x >> y;
        if (op == 1)
        {
            fout << qry(1, n, x, y, 1) << '\n';
        }
        else
        {
            upd(1, n, x, -y, 1);
        }
    }
}