Cod sursa(job #1434613)

Utilizator sulzandreiandrei sulzandrei Data 10 mai 2015 22:53:23
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>
#define lli long long int
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int N;
int v[100003];
inline int formula_inventata_de_mine(int poz)
{
    return (poz - ( poz & (poz-1) ) );
}
int formula_lor(int poz)
{
    return (poz & -poz);
}
void modifica(int poz,int val)
{
    while( poz <= N )
    {
        v[poz] +=val;
        poz += formula_inventata_de_mine(poz);
    }
}
lli suma( int poz )
{
    lli s = 0;
    while( poz > 0 )
    {
        s += v[poz];
        poz -= formula_inventata_de_mine(poz);
    }
    return s;
}
int minim(int val)
{
    int l = 1,r = N;
    int mij;
    while( l<=r )
    {
        mij = (l+r)/2;
        if(suma(mij) == val)
            return mij;
        else
            if( suma(mij)<val)
                l = mij+1;
            else
                r = mij-1;
    }
    return -1;
}
int main()
{

    int M,a,b,i,op;
    in >> N >> M;
    for( i = 0 ; i <= N ; i ++)
        v[i] = 0;
    for( i = 1 ; i <= N ; i ++)
    {
        in >> b;
        modifica(i,b);
    }
    while(M)
    {
        in >> op;
        switch(op)
        {
            case 0 : in >> a >> b; modifica(a,b); break;
            case 1 : in >> a >> b; out<<suma(b)-suma(a-1)<<"\n"; break;
            case 2 : in >> a; out<<minim(a)<<"\n"; break;
        }
        M--;
    }
    return 0;
}