Cod sursa(job #2444991)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 2 august 2019 09:44:24
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, v[15006], p, x, y, arb[50006];

void build(int st, int dr, int nod_curent);
void update();
int query(int st, int dr, int nod_curent);

void build(int st, int dr, int nod_curent)
{
    if (st > dr) return;
    if (st == dr)
    {
        arb[nod_curent] = v[st];
        return;
    }
    int mid = (st + dr) / 2, fiu = nod_curent * 2;
    build(st, mid, fiu);
    build(mid + 1, dr, fiu + 1);
    arb[nod_curent] = arb[fiu] + arb[fiu + 1];
}

int query(int st, int dr, int nod_curent)
{
    if (st > dr) return 0;
    if (st > y || dr < x) return 0;
    if (st >= x && st <= y && dr >= x && dr <= y) return arb[nod_curent];
    int mid = (st + dr) / 2, fiu = nod_curent * 2;
    return query(st, mid, fiu) + query(mid + 1, dr, fiu + 1);
}

void update(int st, int dr, int nod_curent)
{
    if (x > dr || x < st) return;
    if (st > dr) return;
    if (st == dr)
    {
        arb[nod_curent] -= y;
        return;
    }
    int mid = (st + dr) / 2, fiu = nod_curent * 2;
    update(st, mid, fiu);
    update(mid + 1, dr, fiu + 1);
    arb[nod_curent] = arb[fiu] + arb[fiu + 1];
}

int main()
{
    fin >> n >> m;
    for (int i = 1; i <= n; ++i)
    {
        fin >> v[i];
    }
    build(1, n, 1);
    while (m--)
    {
        fin >> p >> x >> y;
        if (p == 1)
        {
            fout << query(1, n, 1) << "\n";
        }
        else
        {
            update(1, n, 1);
        }
    }
    return 0;
}