Cod sursa(job #1151337)

Utilizator supermitelArdelean Razvan Mitel supermitel Data 24 martie 2014 07:52:31
Problema Arbori indexati binar Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>

using namespace std;

int n, T;
int arb[100010];

int bit(int x)
{
    return x&(~(x-1));
}

void add(int poz, int val)
{
    if(!poz || poz > n)
        return;
    arb[poz] += val;
    add(poz+bit(poz), val);
}

int sum(int x)
{
    if(!x || x > n)
        return 0;
    return arb[x]+sum(x - bit(x));
}

int caut(int x)
{
    int crt = 1;
    int rez = 0;
    while(crt <= n)
        crt<<=1;
    crt>>=1;
    while(crt)
    {
        if(arb[crt+rez] <= x)
        {
            x-=arb[crt+rez];
            rez+=crt;
        }
        if(x == 0)
            return rez;
        crt >>= 1;
    }
    return -1;
}

void citire()
{
    scanf("%d%d", &n, &T);
    int x;
    for(int i = 1; i <= n; i++)
    {
        scanf("%d", &x);
        add(i, x);
    }
}

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    citire();
    int tip, x, y;
    while(T--)
    {
        scanf("%d", &tip);
        switch(tip)
        {
        case 0:
            scanf("%d%d", &x, &y);
            add(x, y);
            break;
        case 1:
            scanf("%d%d", &x, &y);
            printf("%d\n", sum(y) - sum(x-1));
            break;
        case 2:
            scanf("%d", &x);
            printf("%d\n", caut(x));
        }
    }
    return 0;
}