Cod sursa(job #3339890)

Utilizator m0rtalChiran Cosmin-Alexandru m0rtal Data 10 februarie 2026 18:35:47
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 15001;

int arr[NMAX], t[4 * NMAX];
int N, M;

void build_sum(int v, int tl, int tr)
{
    if(tl == tr)
    {
        t[v] = arr[tl];
    } else
    {
        int tm = (tl + tr) / 2;
        build_sum(v * 2, tl, tm);
        build_sum(v * 2 + 1, tm + 1, tr);
        t[v] = t[v * 2] + t[v * 2 + 1];
    }
}

int query_sum(int v, int tl, int tr, int l, int r)
{
    if(l > r)
        return 0;
    if(l == tl && r == tr)
        return t[v];
    int tm = (tl + tr) / 2;
    return query_sum(v * 2, tl, tm, l, min(r, tm)) + query_sum(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r);
}

void update_sum(int v, int tl, int tr, int pos, int val)
{
    if(tl == tr)
        t[v] -= val;
    else
    {
        int tm = (tl + tr) / 2;
        if(pos <= tm)
            update_sum(v * 2, tl, tm, pos, val);
        else
            update_sum(v * 2 + 1, tm + 1, tr, pos, val);
        t[v] = t[2 * v] + t[2 * v + 1];
    }
}

int main()
{
    in >> N >> M;
    for(int i = 1; i <= N; i++)
        in >> arr[i];
    build_sum(1, 1, N);
    int op, a, b;
    for(int i = 1; i <= M; i++)
    {
        in >> op >> a >> b;
        if(op == 0)
        {
            update_sum(1, 1, N, a, b);
        } else if(op == 1)
        {
            out << query_sum(1, 1, N, a, b) << "\n";
        }
    }

    return 0;
}