Cod sursa(job #1398525)

Utilizator alevasluialeHuhurez Marius alevasluiale Data 24 martie 2015 11:45:54
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#define bit(x) (x&(-x))
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int N=100001;
int v[N],n;
inline void adauga(int pos,int val)
{
    for(;pos<=n;pos+=bit(pos))
    {
        v[pos]+=val;
    }
}
int suma(int pos)
{
    int suma=0;
    for(;pos>=1;pos-=bit(pos)) 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";
        }
    }
}