Cod sursa(job #1242289)

Utilizator Vally77FMI Calinescu Valentin Gelu Vally77 Data 14 octombrie 2014 11:22:04
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream ka("datorii.in");
ofstream ki("datorii.out");
const int N_MAX = 15000;

int n, m, x, y, c;
int noduri[3 * N_MAX];

void modificare(int a, int b, int inc, int sf, int nod)
{
    if(inc == sf)
        noduri[nod] -= b;
    else
    {
        int m = (inc + sf) / 2;
        if(a <= m)
            modificare(a, b, inc, m, nod * 2);
        else
            modificare(a, b, m + 1, sf, nod * 2 + 1);
        noduri[nod] = noduri[2 * nod] + noduri[2 * nod + 1];
    }
}

int cauta(int a, int b, int inc, int sf, int nod)
{
    int m = (inc + sf) / 2;
    if(a == inc && b == sf)
        return noduri[nod];
    else if(b <= m)
        return cauta(a, b, inc, m, nod * 2);
    else if(a > m)
        return cauta(a, b, m + 1, sf, nod * 2 + 1);
    else
        return cauta(a, m, inc, m, nod * 2) + cauta(m + 1, b, m + 1, sf, nod * 2 + 1);
}

int main()
{
    ka >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        ka >> x;
        modificare(i, -x, 1, n, 1);
    }
    for(int i = 1; i <= m; i++)
    {
        ka >> c >> x >> y;
        if(c == 0)
            modificare(x, y, 1, n, 1);
        else
            ki << cauta(x, y, 1, n, 1) << '\n';
    }
}