Cod sursa(job #2042432)

Utilizator calin1Serban Calin calin1 Data 18 octombrie 2017 16:56:49
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <cstdio>
#define N 100005

using namespace std;

int vec[N], n, m;

void update(int init_poz, int x)
{
    for(int i = init_poz ; i <= n ; )
    {
        vec[i] += x;

        i += ((i ^ (i - 1)) & i);
    }
}

int sum_poz(int poz)
{
    int sum = 0;

    for(int i = poz ; i > 0 ; )
    {
        sum += vec[i];

        i -= ((i ^ (i - 1)) & i);
    }

    return sum;
}

int binary__search(int total_sum)
{
    int left = 1 , right = n, midle, tmp_sum = -1;

    while(left != right)
    {
        midle = ( left + right ) >> 1;

        tmp_sum = sum_poz(midle);

        if(tmp_sum >= total_sum)
        {
            right = midle;
            continue;
        }
        if(tmp_sum < total_sum)
        {
            left = midle + 1;
            continue;
        }
    }

    return left;
}

void solve()
{
    int caz, a, b;

    for(int i = 1 ; i <= m ; ++i)
    {
        scanf("%d ", &caz);

        if(caz == 2)
        {
            scanf("%d\n", &a);

            printf("%d\n", binary__search(a));
        }
        else
        {
            scanf("%d %d\n", &a, &b);

            if(caz == 0)
            {
                update(a,b);
            }
            else
            {
                printf("%d\n", sum_poz(b) - sum_poz(a - 1));
            }
        }
    }
}

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

    int x;

    for(int i = 1 ; i <= n ; ++i)
    {
        scanf("%d ", &x);

        update(i,x);
    }

    solve();
}

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

    read();

    return 0;
}