Cod sursa(job #1812425)

Utilizator vladbatalanBatalan Vlad vladbatalan Data 22 noiembrie 2016 08:39:28
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>

using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

int aib[100010],n,m,op,a,b,x;

void update(int poz, int val)
{
    for(; poz<=n; poz+=((-poz)&poz))
        aib[poz]+=val;
}

int sum(int poz)
{
    int s=0;
    for(;poz;poz-=poz&(-poz))
        s+=aib[poz];
    return s;
}

void srch(int k)
{
    int lo=1,hi=n,mi,sc;
    do{
        mi=(lo+hi)/2;
        sc=sum(mi);
        if(sc<k)
            lo=mi+1;
        else
            hi=mi-1;
    }while(lo<hi);
    mi=(lo+hi)/2;
    sc=sum(mi);
    if(sc==k)
        fout<<mi<<'\n';
    else{
        if(sc<k)
            fout<<mi+1<<'\n';
        else
            fout<<mi-1<<'\n';
    }
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        fin>>x;
        update(i,x);
    }
    while(m--)
    {
        fin>>op;
        switch(op)
        {
            case 0:
                fin>>a>>b;
                update(a,b);
                break;
            case 1:
                fin>>a>>b;
                fout<<sum(b)-sum(a-1)<<'\n';
                break;
            case 2:
                fin>>a;
                srch(a);
                break;
        }
    }
    return 0;
}