Cod sursa(job #2221834)

Utilizator inquisitorAnders inquisitor Data 15 iulie 2018 23:42:25
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <cstdio>

int length, BIT[100001];

__attribute__((always_inline)) void Update(int position, int value)
{
    for(int index = position; index <= length; index += index & -index)
    {
        BIT[index] += value;
    }
}

__attribute__((always_inline)) int Querry(int position)
{
    int sum = 0;

    for(int index = position; index; index -= index & -index)
    {
        sum += BIT[index];
    }

    return sum;
}

__attribute__((always_inline)) int Search(int sum)
{
    int i, step;

    for(step = 1; step <= length; step <<= 1);

    for(i = 0; step; step >>= 1)
    {
         if(i + step <= length && sum >= BIT[i + step])
         {
            i += step;

            sum -= BIT[i];

            if(!sum) return i;
         }
    }

    return -1;
}

int main(){

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

    int operations, task, x, y;

    scanf("%d %d", &length, &operations);

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

        Update(i, x);
    }

    while(operations--)
    {
        scanf("%d", &task);

        switch(task)
        {
            case 0: scanf("%d %d", &x, &y);
                    Update(x, y);
                    break;

            case 1: scanf("%d %d", &x, &y);
                    printf("%d\n", Querry(y) - Querry(x - 1));
                    break;

            case 2: scanf("%d", &x);
                    printf("%d\n", Search(x));
        }
    }

    return 0;
}