Cod sursa(job #3305998)

Utilizator CezarTTambozi Cezar Justin CezarT Data 6 august 2025 14:57:35
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>
using namespace std;

int v[100005], aint[400005];

void maketree(int i, int p, int q)
{
    if (p == q)
        aint[i] = v[p];
    else
    {
        int m = (p + q) / 2;
        maketree(i * 2, p, m);
        maketree(i * 2 + 1, m + 1, q);
        aint[i] = aint[i * 2] + aint[i * 2 + 1];
    }
}

void update(int i, int p, int q, int a)
{
    if (p == q)
        aint[i] = v[p];
    else
    {
        int m = (p + q) / 2;
        if (a <= m)
            update(i * 2, p, m, a);
        else
            update(i * 2 + 1, m + 1, q, a);
        aint[i] = aint[i * 2] + aint[i * 2 + 1];
    }
}

int query(int i, int l, int r, int s, int d)
{
    if (s <= l && r <= d)
        return aint[i];
    else if (r < s || d < l)   
        return 0;
    else
    {
        int m = (l + r) / 2;
        int ls = query(2 * i, l, m, s, d), rd = query(2 * i + 1, m + 1, r, s, d);
        return ls + rd;
    }
}

int main() 
{
    ifstream cin("datorii.in");
    ofstream cout("datorii.out");
	int n, q; cin >> n >> q;
    for (int i = 1; i <= n; i ++)
        cin >> v[i];
    maketree(1, 1, n);
    while (q --)
    {
        int a, b, c; cin >> a >> b >> c;
        if (a == 1)
        {
            cout << query(1, 1, n, b, c) << '\n';
        }
        else if (a == 0)
        {
            v[b] -= c;
            update(1, 1, n, b);
        }
    }
}