Cod sursa(job #2817940)

Utilizator LukyenDracea Lucian Lukyen Data 14 decembrie 2021 19:32:26
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <bits/stdc++.h>
using namespace std;

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

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

long int i, j;

void init_tree(long int poz, long int st, long int dr)
{
    if (st == dr)
        tree[poz] = elem[st];
    else
    {
        long 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(long int poz, long int st, long int dr, long int val, long int poz_val)
{
    if (st == dr)
        tree[poz] = max((long)0, tree[poz] - val);
    else
    {
        long 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];
    }
}

long int query(long int poz, long int st, long int dr, long int st_q, long int dr_q)
{
    if (st_q <= st && dr <= dr_q)
        return tree[poz];
    else
    {
        long 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);
    }

    return 0;
}

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

    init_tree(1, 1, nr_elem);

    long 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;
}