Cod sursa(job #841782)

Utilizator GaborGabrielFMI - GabrielG GaborGabriel Data 24 decembrie 2012 21:40:18
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <cmath>
using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

int n,m,v[100005],i,a,b,c,auxiliar=0;

int nr_zero(int k)
{
    int q=0;
    while(k && k%2==0)
        q++,k/=2;
    return q;
}

void adauga(int poz,int val)
{
    if(poz<=n)
    {
        v[poz]+=val;
        adauga(poz + pow(2,nr_zero(poz)),val);
    }
}

long long suma(int pozitie)
{
    if(pozitie>0)
        return v[pozitie] + suma(pozitie - pow(2,nr_zero(pozitie)));
    return 0;
}

int cauta(int st,int dr,long long ss)
{
    if(st==dr)
        if(suma(st)==ss)
            return st;
        else
            return -1;
    int mijloc = suma((st+dr)/2);
    if(mijloc==ss)
    {
        auxiliar = 1;
        return (st+dr)/2;
    }
    else
    if(ss>mijloc)
        cauta(((st+dr)/2) +1,dr,ss);
    else
        cauta(st,(st+dr)/2,ss);
}

int cauta(int val)
{
    int i, step;

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

    for( i = 0; step; step >>= 1 )
    {
         if( i + step <= n)
         {
            if( val >= v[i+step] )
            {
                i += step, val -= v[i];
                if ( !val ) return i;
            }
         }
    }

    return -1;
}

int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
        f>>a,adauga(i,a);


    while(m)
    {
        f>>a;
        if(a==0)
            f>>b>>c,adauga(b,c);
        else
        if(a==1)
            f>>b>>c,g<<suma(c)-suma(b-1)<<'\n';
        else
            f>>b,g<<cauta(b)<<'\n';
        m--;
    }

    return 0;
}