Cod sursa(job #1256220)

Utilizator roxana.aeleneiAelenei Roxana roxana.aelenei Data 5 noiembrie 2014 22:07:05
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
using namespace std;
int aib [100001];
inline int lsb (int x)
{
    return x&(x-1)^x;
}
void update (int n, int poz, int val)
{
    for( ; poz<=n; poz+=lsb(poz))
    aib[poz]+=val;
}
int query (int b)
{
    int s=0;
    for(; b; b-=lsb(b))
        s+=aib[b];
    return s;
}
int main()
{
    ifstream in("aib.in");
    ofstream out("aib.out");
     int n,m,i,x,op,a,b,k,inc,sfr,mij,aux;
    in>>n>>m;
    for(i=1;i<=n;i++)
    {
        in>>x;
        update(n,i,x);
    }
    for(i=1;i<=m;i++)
    {
        in>>op;
        if(op==0)
        {
            in>>a>>b;
            update(n,a,b);
        }
        if(op==1)
        {
            in>>a>>b;
            out<<query(b)-query(a-1)<<'\n';
        }
        if(op==2)
        {
            in>>a;
            inc=1;
            sfr=n;
            k=-1;
            while(inc<=sfr)
            {
                mij=(inc+sfr)>>1;
                aux=query(mij);
                if(aux>=a)
                {
                    if(aux==a)
                        k=mij;
                    sfr=mij-1;
                }
                else
                    inc=mij+1;
            }
         out<<k<<"\n";
         }
    }
    return 0;
}