Cod sursa(job #2776430)

Utilizator Rares5000Baciu Rares Rares5000 Data 19 septembrie 2021 19:26:37
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#define oo 2e9

using namespace std;

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

struct Nod
{
    int info;
    Nod *st, *dr;
};

int v[100002];
Nod *node;

void Creare(Nod *&node, int st, int dr)
{
    node = new Nod;
    if(st == dr)
        node -> info = v[st];
    else
    {
        int mij = st + (dr - st) / 2;
        Creare(node -> st, st, mij);
        Creare(node -> dr, mij + 1, dr);
        node -> info = node -> st -> info + node -> dr -> info;
    }
}

void Actualizare(Nod *&node, int st, int dr, int val)
{
    if(val == st)
        node -> info = v[st];
    else
    {
        int mij = st + (dr - st) / 2;
        if(val <= mij)
            Actualizare(node -> st, st, mij, val);
        else Actualizare(node -> dr, mij + 1, dr, val);
        node -> info = node -> st -> info + node -> dr -> info;
    }
}

int Find(Nod *node, int x, int y, int st, int dr)
{
    if(x == y)
        return v[x];
    int mij = st + (dr - st) / 2;
    if(x <= st && dr <= y)
        return node -> info;
    if(y < st || x > dr)
        return oo;
    if(y <= mij)
        return Find(node -> st, x, y, st, mij);
    if(x > mij)
        return Find(node -> dr, x, y, mij + 1, dr);
    return Find(node -> st, x, mij, st, mij) + Find(node -> dr, mij + 1, y, mij + 1, dr);
}

int main()
{
    int n, m, i, x, y, task;
    fin >> n >> m;
    for(i = 1; i <= n; i++)
        fin >> v[i];
    Creare(node, 1, n);
    for(i = 1; i <= m; i++)
    {
        fin >> task >> x >> y;
        if(task == 0)
        {
            v[x] -= y;
            Actualizare(node, 1, n, x);
        }
        else
        {
            fout << Find(node, x, y, 1, n) << "\n";
        }
    }
    return 0;
}