Cod sursa(job #2445753)

Utilizator catalin9898Bajenaru Catalin catalin9898 Data 5 august 2019 14:14:37
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <cstdio>
using namespace std;
#define lsb(x) ((x & (x-1)) ^ x)

int n, v[100005];

void add(int poz, int x)
{
    int i;
    for(i = poz; i <= n; i += lsb(i))
        v[i] += x;
}

int sum(int p)
{
    int rez = 0;
    for(p; p > 0; p -= lsb(p))
        rez += v[p];
    return rez;
}

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    int i, m, j, a, b, bin, rez;

    scanf("%d%d", &n, &m);
    for(bin = 1; bin < n; bin <<= 1);
    bin >>= 1;
    for(i = 1; i <= n; i++)
    {
        scanf("%d", &j);
        add(i, j);
    }
    for(i = 0; i < m; i++)
    {
        scanf("%d", &j);
        switch(j)
        {
        case 0:
            scanf("%d%d", &a, &b);
            add(a, b);
            break;
        case 1:
            scanf("%d%d", &a, &b);
            a = sum(a - 1);
            b = sum(b);
            printf("%d\n", b - a);
            break;
        case 2:
            scanf("%d", &a);
            rez = 0;
            for(j = bin; j > 0; j>>= 1)
            {
                if(rez + j > n)continue;
                b = sum(rez + j);
                if(a >= b)
                {
                    rez += j;
                    if(a == b)break;
                }
            }
            if(a == sum(rez))
                printf("%d\n", rez);
                else printf("-1\n");
        }

    }
    return 0;
}