Cod sursa(job #186344)

Utilizator andrei_infoMirestean Andrei andrei_info Data 27 aprilie 2008 18:50:39
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>

using namespace std;

#define MAX 100005

int arb[MAX], N,M;

ifstream fin("aib.in");
ofstream fout("aib.out");

int query(int poz)
{
    int rez = 0;
    for ( ; poz >0; poz -= ( poz ^ (poz-1)) & poz)
        rez+= arb[poz];
    return rez;
}

void update(int poz, int val)
{
    for ( ; poz <=N; poz += (poz ^ (poz-1)) & poz)
        arb[poz] += val;
}

int search( int sum )
{
    int st = 1, dr = N, poz=-1;
    while ( st <= dr )
    {
        int mid = (st + dr ) >> 1;
        int c = query(mid);
        if ( c == sum )
            return mid;
        if ( c < sum )
            st = mid +1;
        else
            dr = mid - 1;
    }
    return poz;
}

int search2 ( int sum )
{
    int poz, st;
    for ( st = 1; st <= N; st <<= 1);

    for ( poz = 0; st; st >>= 1)
    {
            if ( poz + st <= N && sum >= arb[poz+st] )
            {
                poz+= st;
                sum -= arb[poz];
                if ( sum == 0 )
                    return poz;
            }
    }
    return -1;
}


int main()
{
    fin>>N>>M;
    for (int i =1; i<=N; i++)
    {
        int aux;
        fin>>aux;
        update(i,aux);
    }
    for ( ; M>0; M--)
    {
        int op, a,b;
        fin>>op;
        if ( op == 0)
        {
            fin>>a>>b;
            update(a,b);
        }
        else
        if ( op == 1)
        {
            fin>>a>>b;
            int rez = query(b) - query(a-1);
            fout<<rez<<"\n";
        }
        else
        {
            fin>>a;
            fout<<search2(a)<<"\n";
        }
    }
}