Cod sursa(job #1826574)

Utilizator maryan_lupMarian Lupascu maryan_lup Data 10 decembrie 2016 17:11:04
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <bits/stdc++.h>
#define DIMMAX 100005
#define FOR(i, a, b) for(int i = a; i <= b; i++)

using namespace std;

ifstream in("datorii.in");
ofstream out("datorii.out");
int N, M;
int ai[DIMMAX*4];

int fiu_st(int f)
{
    return 2 * f;
}

int fiu_dr(int f)
{
    return 2 * f + 1;
}

void update(int nod, int st, int dr, int valoare, int pozitie)
{
    if(st == dr)
    {
        ai[nod] = valoare;
        return;
    }
    int mij = (st + dr) / 2;
    if(pozitie <= mij)
        update(fiu_st(nod), st, mij, valoare, pozitie);
    else
        update(fiu_dr(nod), mij + 1, dr, valoare, pozitie);

    ai[nod] = ai[fiu_st(nod)] + ai[fiu_dr(nod)];
}

int query(int nod, int st, int dr, int inf, int sup)
{
    if (inf <= st && sup >= dr)
    {
        return ai[nod];
    }

    int mij = (st + dr) / 2;
    int a = 0, b = 0;
    if (inf <= mij)
        a = query(fiu_st(nod), st, mij, inf, sup);
    if (mij < sup)
        b = query(fiu_dr(nod), mij + 1, dr, inf, sup);
    return a + b;
}

int main()
{
    in >> N >> M;
    int aux;
    int v[DIMMAX];
    FOR(i, 1, N)
    {
        in >> aux;
        v[i] = aux;
        update(1, 1, N, aux, i);
    }

    int op, a, b;
    FOR(i, 1, M)
    {
        in >> op >> a >> b;
        if(op == 0)
        {
            v[a] = v[a] - b;
            update(1, 1, N, v[a], a);
        }
        else
        {
            out << query(1, 1, N, a, b) << '\n';
        }
    }

    in.close();
    out.close();
    return 0;
}