Cod sursa(job #2812680)

Utilizator StefantimStefan Timisescu Stefantim Data 4 decembrie 2021 21:44:45
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define lsb(X) ((X) & -(X))
int n;
const int NMAX = 100000;
int arb[NMAX+5];
void update(int poz, int val)
{
    while(poz<=n)
    {
        arb[poz]+=val;
        poz+=lsb(poz);
    }
}
int query(int poz)
{
    int s=0;
    while(poz>0)
    {
        s+=arb[poz];
        poz-=lsb(poz);
    }
    return s;
}

int cauta(int val)
{
    int i, step;

    for ( step = 1; step <= n; step <<= 1 );

    for( i = 0; step; step >>= 1 )
    {
        if( i + step <= n)
        {
            if( val >= arb[i+step] )
            {
                i += step, val -= arb[i];
                if ( !val )
                    return i;
            }
        }
    }
}
int main()
{
    int i, x, m, pb,y;
    fin>>n;
    fin>>m;
    for(i=1;i<=n;i++)
    {
        fin>>x;
        update(i,x);
    }
    for(i=1;i<=m;i++)
    {
        fin>>pb;
        if(pb==0)
        {
            fin>>x>>y;
            update(x,y);
        }
        else
        if(pb==1)
        {
            fin>>x>>y;
            fout<<query(y)-query(x-1)<<"\n";
        }
        else
        if(pb==2)
        {
            fin>>x;
            fout<<cauta(x)<<"\n";
        }

    }
    return 0;
}