Cod sursa(job #2433652)

Utilizator claudiu.gatinaFMI Claudiu Gatina claudiu.gatina Data 28 iunie 2019 14:31:28
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <iostream>
#include <cstdio>

using namespace std;

int n, m, l;
int arb[40000];

void read()
{

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

    l = 1;
    while(l < n)
        l <<= 1;

    for(int i = l; i < l + n; ++i)
    {
        scanf("%d", &arb[i]);
    }
}

void initArb()
{
    for(int i = l - 1, j = i << 1; i; --i, j -= 2)
        arb[i] = arb[j] + arb[j + 1];
}

void printSum(int x, int y)
{
    int sum = 0;

    while(x != y)
    {
        if(x & 1)
            sum -= arb[x - 1];
        if(!(y & 1))
            sum -= arb[y + 1];

        x >>= 1;
        y >>= 1;
    }

    sum += arb[x];

    printf("%d\n", sum);
}

void solve()
{
    --l;
    for(int i = 0; i < m; ++i)
    {
        int op, x, y;
        scanf("%d", &op);
        scanf("%d", &x);
        scanf("%d", &y);
        if(op == 0)
        {
            for(int r = l + x; r; r >>= 1)
                arb[r] -= y;
        }
        if(op == 1)
        {
            printSum(l + x, l + y);
        }
    }
}

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

    read();
    initArb();
    solve();

    return 0;
}