Cod sursa(job #2410441)

Utilizator AndreiTudorSpiruAndrei Spiru AndreiTudorSpiru Data 20 aprilie 2019 08:32:48
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,arb[100001];
void update(int poz,int val)
{
    int c=0;

    while(poz<=n)
    {
        arb[poz]+=val;
        while(!(poz&(1<<c)))c++;
        poz+=(1<<c);
        c++;
    }
}
int query(int poz)
{
    int c=0,s=0;

    while(poz>0)
    {
        s+=arb[poz];
        while(!(poz&(1<<c)))c++;
        poz-=(1<<c);
        c++;
    }
    return s;
}
int query2(int val)
{
    int step,i,poz=0;

    for(step = 1; step<n ; step <<= 1);
    //cout<<step<<" ";

        for(i=0; step; step >>= 1)
        {
           if(i+step<=n)
           {
               if(arb[i+step]<=val)
               {
                   val-=arb[i+step];
                   i+=step;
                   if(!val){return i;}
               }
           }
        }

        return -1;

}
int m,i,q,a,b,x;
int main()
{
    f>>n>>m;
    for(i=1; i<=n; i++)
    {
        f>>x;
        update(i,x);
    }
    for(i=1;i<=m;i++)
    {
        f>>q;
        if(q<=1)
        {
            f>>a>>b;
            if(q==0)update(a,b);
            else g<<query(b)-query(a-1)<<'\n';
        }
        else
        {
            f>>a;
            g<<query2(a)<<'\n';
        }
    }
    return 0;
}