Cod sursa(job #1398516)

Utilizator alevasluialeHuhurez Marius alevasluiale Data 24 martie 2015 11:42:18
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>

using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int N=100001;
int v[N],n;
int p[19]={0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072};
inline void adauga(int pos,int val)
{
    int k;
    while(pos<=n)
    {
        v[pos]+=val;
        k=1;
        while((pos&p[k])==0) k++;
        pos+=p[k];
    }
}
int suma(int pos)
{
    int suma=v[pos],k;
    while(pos!=0)
    {
        k=1;
        while((pos&p[k])==0) k++;
        pos-=p[k];
        suma+=v[pos];
    }
    return suma;
}
int cauta(int sum)
{
    int mij,st=1,dr=n,val;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        val=suma(mij);
        if(val==sum) return mij;
        else if(val<sum) st=mij+1;
        else if(val>sum) dr=mij-1;
    }
    return -1;
}
int main()
{
    int m,i,ok,a,b;
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        fin>>ok;
        adauga(i,ok);
    }
    for(i=1;i<=m;i++)
    {
        fin>>ok;
        if(ok==2)
        {
            fin>>a;
            fout<<cauta(a)<<"\n";
        }
        else
        {
            fin>>a>>b;
            if(ok==0) adauga(a,b);
            else fout<<suma(b)-suma(a-1)<<"\n";
        }
    }
}