Cod sursa(job #3365563)

Utilizator irina_opreaIrina Oprea irina_oprea Data 22 septembrie 2026 14:39:40
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <iostream>
#include <fstream>

using namespace std;

const int NMAX = 4e4;

long long v[NMAX], sum=0, n;

void build(int, int, int, int, int);
void update(int, int, int, int, int);
void search_aint(int, int, int, int, int);

int main()
{
    ifstream cin ("datorii.in");
    ofstream cout ("datorii.out");

    int m, cer, a, zi, b;
    cin >> n >> m;
    for (int i=0; i<n; i++)
    {
        cin >> a;
        build(1, 1, n, a, i+1);
    }
    for (int i=0; i<n; i++)
    {
        cin >> cer >> a >> b;
        if (cer == 0)
        {
            zi = a;
            update(1, 1, n, b, zi);
        }
        else
        {
            sum = 0;
            search_aint(1, 1, n, a, b);
            cout << sum << '\n';
        }
    }
    return 0;
}

void build(int nod, int st, int dr, int val, int poz)
{
    if (st == dr)
    {
        v[nod] = val;
        return;
    }
    int mid = (st+dr)/2;
    if (poz <= mid)
    {
        build(2*nod, st, mid, val, poz);
    }
    else build(2*nod+1, mid+1, dr, val, poz);
    v[nod] = v[2*nod] + v[2*nod+1];
    return;
}

void update(int nod, int st, int dr, int val, int poz)
{
    if (st == dr)
    {
        v[nod] -= val;
        return;
    }
    int mid = (st+dr)/2;
    if (poz <= mid)
    {
        update(2*nod, st, mid, val, poz);
    }
    else update(2*nod+1, mid+1, dr, val, poz);
    v[nod] = v[2*nod] + v[2*nod+1];
    return;
}

void search_aint(int nod, int st, int dr, int a, int b)
{
    if ((a <= st) && (dr <= b))
    {
        sum += v[nod];
        return;
    }
    int mid = (st+dr)/2;
    if (a <= mid)
    {
        search_aint(2*nod, st, mid, a, b);
    }
    if (mid < b)
    {
        search_aint(2*nod+1, mid+1, dr, a, b);
    }
    return;
}