Cod sursa(job #1785269)

Utilizator vladdy47Bucur Vlad Andrei vladdy47 Data 20 octombrie 2016 23:59:13
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
# include <bits/stdc++.h>

using namespace std;

const int Nmax = 15000 + 5;

int n, m, i, op, a, b, v[Nmax], arb[Nmax * 4];

void build (int node, int left, int right)
{
    if (left == right)
    {
        arb[node] = v[left];
        return ;
    }

    int mid = (left + right) / 2;

    build (node * 2, left, mid);
    build (node * 2 + 1, mid + 1, right);

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

void achit (int node, int left, int right, int pos, int val)
{

    if (left == right)
    {
        arb[node] -= val;
        return ;
    }

    int mid = (left + right) / 2;

    if (pos <= mid) achit (node * 2, left, mid, pos, val);
    else achit (node * 2 + 1, mid + 1, right, pos, val);

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

int query (int node, int left, int right, int a, int b)
{

    if (a <= left && right <= b) return arb[node];

    int mid = (left + right) / 2;

    int sum = 0;

    if (a <= mid) sum += query (node * 2, left, mid, a, b);
    if (b > mid) sum += query (node * 2 + 1, mid + 1, right, a, b);

    return sum;
}

int main ()
{
    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);

    scanf("%d %d\n", &n, &m);

    for (i = 1; i <= n; ++i)
        scanf("%d ", &v[i]);

    build (1, 1, n);

    for (i = 1; i <= m; ++i)
    {
        scanf("%d %d %d\n", &op, &a, &b);

        if (!op) achit(1, 1, n, a, b);
        else printf("%d\n", query(1, 1, n, a, b) );
    }

    return 0;
}