Cod sursa(job #1384763)

Utilizator andreiulianAndrei andreiulian Data 11 martie 2015 13:36:57
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<iostream>
#include<fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int N,M,c[100005];
void adauga(int ind,int x);
int suma(int ind);
int poz(int sum);
int main()
{
    in>>N>>M;
    int i,x,o,a,b;
    for(i=1;i<=N;++i)
    {
        in>>x;
        adauga(i,x);
    }
    while(M--)
    {
        in>>o;
        if(o==0)
        {
            in>>a>>b;
            adauga(a,b);
        }
        if(o==1)
        {
            in>>a>>b;
            out<<suma(b)-suma(a-1)<<'\n';
        }
        if(o==2) in>>a,out<<poz(a)<<'\n';
    }
}
int poz(int sum)
{
    int s=1,d=N,m=0,x;
    while(s<=d)
    {
        m=s+(d-s)/2;
        x=suma(m);
        if(x==sum) return m;
        if(x<sum)
            s=m+1;
        else
            d=m-1;
    }
    if(x==sum) return m;
    return -1;
}
void adauga(int ind,int x)
{
    int pow2;
    do
    {
        c[ind]+=x;
        pow2=1;
        while(!(ind & pow2))
        {
            pow2=(pow2<<1);
        }
        ind+=pow2;
    }while(ind<=N);
}
int suma(int ind)
{
    int pow2,r=0;
    do
    {
        r+=c[ind];
        pow2=1;
        while(!(ind & pow2))
        {
            pow2<<=1;
        }
        ind-=pow2;
    }while(ind>0);
    return r;
}