Cod sursa(job #186338)

Utilizator andrei_infoMirestean Andrei andrei_info Data 27 aprilie 2008 18:10:42
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 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 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<<search(a)<<"\n";
        }
    }
}