Cod sursa(job #2817930)

Utilizator LukyenDracea Lucian Lukyen Data 14 decembrie 2021 18:54:01
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <bits/stdc++.h>
using namespace std;

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

int tree[60004], elem[15001];
int nr_elem, nr_query;

int i, j;

void init_tree(int poz, int st, int dr)
{
    if (st == dr)
        tree[poz] = elem[st];
    else
    {
        int middle = (st + dr) / 2;
        init_tree(poz * 2, st, middle);
        init_tree(poz * 2 + 1, middle + 1, dr);
        tree[poz] = tree[poz * 2] + tree[poz * 2 + 1];
    }
}

void update(int poz, int st, int dr, int val, int poz_val)
{
    if (st == dr)
        tree[poz] = max(0, tree[poz] - val);
    else
    {
        int middle = (st + dr) / 2;
        if (poz_val <= middle)
            update(poz * 2, st, middle, val, poz_val);
        else
            update(poz * 2 + 1, middle + 1, dr, val, poz_val);
        tree[poz] = tree[poz * 2] + tree[poz * 2 + 1];
    }
}

int query(int poz, int st, int dr, int st_q, int dr_q)
{
    if (st_q <= st && dr <= dr_q)
        return tree[poz];
    else
    {
        int middle = (st + dr) / 2;
        if (st_q >= middle + 1)
            return query(poz * 2 + 1, middle + 1, dr, st_q, dr_q);
        else if (dr_q <= middle)
            return query(poz * 2, st, middle, st_q, dr_q);
        else
            return query(poz * 2, st, middle, st_q, dr_q) + query(poz * 2 + 1, middle + 1, dr, st_q, dr_q);
    }
}

int main()
{
    fin >> nr_elem >> nr_query;
    for (i = 1; i <= nr_elem; i++)
        fin >> elem[i];

    init_tree(1, 1, nr_elem);

    int tip, a, b;
    for (i = 1; i <= nr_query; i++)
    {
        fin >> tip >> a >> b;
        if (tip == 1)
            fout << query(1, 1, nr_elem, a, b) << "\n";
        else
            update(1, 1, nr_elem, b, a);
    }

    return 0;
}