Cod sursa(job #1137237)

Utilizator cat_red20Vasile Ioana cat_red20 Data 9 martie 2014 12:23:11
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<fstream>
using namespace std;

int v[100001],m,n,s[100001];
ifstream fin("aib.in");
ofstream fout("aib.out");

void update(int ind,int val)
{
    int poz=0;
    for(int poz=0;ind<=m;ind+=1<<poz,poz++)
    {
        v[ind]+=val;
        for(;(ind&(1<<poz))==0;poz++);
    }
}

int query(int ind)
{
    int sol=0;
    for(int poz=0;ind>0;ind-=1<<poz,poz++)
    {
        sol+=v[ind];
        for(;(ind&(1<<poz))==0;poz++);
    }
    return sol;
}

int search(int k)
{
    int step;
    for(step=1;step<m;step<<=1);

    for(int i=0;step;step>>=1)
    {
        if(i+step<=m && k>=v[i+step])
        {
            i+=step;
            k-=v[i];
            if(k==0)
                return i;
        }
    }
    return -1;
}

int main()
{
    int poz,val,op,a,b;
    fin>>m>>n;
    for(int i=1;i<=m;i++)
    {
        fin>>val;
        update(i,val);
    }
    for(int i=1;i<=n;i++)
    {
        fin>>op;
        switch(op)
        {
            case 0: fin>>poz>>val;
                    update(poz,val);
                    break;
            case 1: fin>>a>>b;
                    fout<<query(b)-query(a-1)<<"\n";
                    break;
            case 2: fin>>a;
                    fout<<search(a)<<"\n";
        }
    }
    return 0;
}