Cod sursa(job #3288826)

Utilizator Mihai_999Diaconeasa Mihai Mihai_999 Data 24 martie 2025 13:44:13
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>
#include <fstream>
#define nl '\n'

using namespace std;

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

const int NMAX = 15005;

int n, v[NMAX], aint[4*NMAX];

void build(int node, int low, int high)
{
    if (low == high)
    {
        aint[node] = v[low];
        return;
    }
    int mid = (low+high)>>1;
    build(2*node, low, mid);
    build(2*node+1, mid+1, high);
    aint[node] = aint[2*node]+aint[2*node+1];
    return;
}

void update(int node, int low, int high, int poz, int val)
{
    if (low == high)
    {
        aint[node]+=val;
        return;
    }
    int mid = (low+high)>>1;
    if (poz <= mid)
        update(2*node, low, mid, poz, val);
    if (mid+1 <= poz)
        update(2*node+1, mid+1, high, poz, val);
    aint[node] = aint[2*node]+aint[2*node+1];
    return;
}

int query(int node, int low, int high, int a, int b)
{
    if (a <= low && high <= b)
        return aint[node];
    int mid = (low+high)>>1, t1 = 0, t2 = 0;
    if (a <= mid)
        t1 = query(2*node, low, mid, a, b);
    if (mid+1 <= b)
        t2 = query(2*node+1, mid+1, high, a, b);
    return t1+t2;
}

int main()
{
    int t;
    fin >> n >> t;
    for (int i = 1; i <= n; i++)
        fin >> v[i];
    build(1, 1, n);
    while (t--)
    {
        int c, x, y;
        fin >> c >> x >> y;
        if (c == 0)
            update(1, 1, n, x, -y);
        if (c == 1)
            fout << query(1, 1, n, x, y) << nl;
    }
    return 0;
}