Cod sursa(job #2901675)

Utilizator Stefania_RincuRincu Stefania Stefania_Rincu Data 14 mai 2022 11:08:38
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <iostream>
#include <fstream>
#include <math.h>

using namespace std;

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

int arb[1000001], v[10000001];

void create(int n, int st, int dr)
{
    if(st == dr)
    {
        arb[n] = v[st];
        return;
    }

    create(n*2, st, (st + dr)/2);
    create(n*2+1, (st + dr)/2 + 1, dr);

    arb[n] = arb[n*2] + arb[n*2+1];
}

void update(int n, int st, int dr, int poz, int x)
{
    if(poz < st || poz > dr)
        return;

    if(st == dr)
    {
        arb[n] -= x;
        return;
    }

    update(2*n, st, (st + dr)/2, poz, x);
    update(2*n + 1, (st + dr)/2 + 1, dr, poz, x);

    arb[n] = arb[2*n] + arb[2*n+1];
}

int sum(int n, int st, int dr, int x, int y)
{
    if(dr < x || st > y)
        return 0;

    if(x <= st && dr <= y)
        return arb[n];

    return sum(n*2, st, (st + dr)/2, x, y) + sum(n*2+1, (st + dr)/2+1, dr, x, y);
}

int main()
{
    int n, m, op, i, x, y;

	in>>n>>m;

	for(i = 0; i < n; i++)
        in>>v[i];

    create(1, 1, n);

	for(i = 0; i < m; i++)
    {
        in>>op>>x>>y;
        if(op == 0)
            update(1, 1, n, x, y);
        else
            out<<sum(1, 1, n, x, y);
    }

    return 0;
}