Cod sursa(job #2812665)

Utilizator StefantimStefan Timisescu Stefantim Data 4 decembrie 2021 21:26:44
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 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 maxim)
{
    int i, s = 0, poz, nr;
    for(i = 1; i <= n ; i=i<<1)
    {
        if(arb[i]>maxim)
        {
            poz=i>>1;
            s = arb[poz];
            nr = poz;
            while(s!=maxim)
            {
                nr+=lsb(poz);
                poz = lsb(poz);
                s+= arb[poz];
            }
            return nr;
        }
    }
}
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;
}