Cod sursa(job #3163247)

Utilizator calin06calin mihaescu calin06 Data 31 octombrie 2023 09:55:38
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <iostream>
#include <fstream>

using namespace std;

const int nmax = 10;
int n, q;
int a[4 * nmax];

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

void build(int nod, int st, int dr)
{
    if (st == dr)
        fin >> a[nod];
    else
    {
        int mid = (st + dr) / 2;
        build(2 * nod, st, mid);
        build(2 * nod + 1, mid + 1, dr);
        a[nod] = a[2 * nod] + a[2 * nod + 1];
    }
}

void update(int nod, int st, int dr, int poz, int val)
{
    if (st == dr)
        a[nod] += val;
    else
    {
        int mid = (st + dr) / 2;
        if (poz <= mid)
            update(2 * nod, st, mid, poz, val);
        else
            update(2 * nod + 1, mid + 1, dr, poz, val);

        a[nod] = a[2 * nod] + a[2 * nod + 1];
    }
}

void query(int nod, int st, int dr, int st_int, int dr_int, int &sol)
{
    if (st >= st_int && dr <= dr_int)
        sol += a[nod];
    else
    {
        int mid = (st + dr) / 2;
        if (st_int <= mid)
            query(2 * nod, st, mid, st_int, dr_int, sol);

        if (dr_int > mid)
            query(2 * nod + 1, mid + 1, dr, st_int, dr_int, sol);
    }
}

int main()
{
    fin >> n >> q;
    build(1, 1, n);
    
    for (int i = 1; i <= q; i++)
    {
        int tip;
        fin >> tip;

        if (tip == 0)
        {
            int poz, val;
            fin >> poz >> val;
            /// update
            update(1, 1, n, poz, -val);
        }
        else
        {
            int st, dr;
            fin >> st >> dr;
            /// query
            int sol = 0;
            query(1, 1, n, st, dr + 1, sol);
            fout << sol << "\n";
        }
    }
}