Cod sursa(job #1213268)

Utilizator kitzTimofte Bogdan kitz Data 27 iulie 2014 18:18:43
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <iostream>

#define in "aib.in"
#define out "aib.out"
#define dim 100001

int N, M, X;
int Tree[dim];
int C, S;

void actualizare(int poz, int val)
{
    C = 0;
    while(poz <= N)
    {
        Tree[poz] += val;
        while ( !(poz & (1<<C)) ) C++;
        poz += (1<<C);
        C += 1;
    }
}

int interogare(int poz)
{
    C = 0; S = 0;
    while(poz > 0)
    {
        S += Tree[poz];
        while( !(poz & (1<<C)) ) C++;
        poz -= (1<<C);
        C += 1;
    }
    return S;
}

int cautare(int val)
{
    int k = 1;
    while(k < N)
        k <<= 1;
    for(int i = 0; k; k >>= 1)
    {
        if(i + k <= N)
        {
            if(val >= Tree[i + k])
            {
                i += k;
                val -= Tree[i];
                if(!val)
                    return i;
            }
        }
    }
    return -1;
}
int main()
{
    std :: ifstream f (in);
    std :: ofstream g (out);
    f >> N >> M;
    int x;
    for(int i = 1; i <= N; i++)
    {
        f >> x;
        actualizare(i, x);
    }
    int p, q;
    while(M != 0)
    {
        f >> x;
        if(x < 2)
        {
            f >> p >> q;
            if( !x )
                actualizare(p, q);
            else
                g << interogare(q) - interogare(p-1) << "\n";
        }
        else
        {
            f >> p;
            g << cautare(p) << "\n";
        }
        M--;
    }
    return 0;
}