Cod sursa(job #2152018)

Utilizator GeorgeCalinPetruta George-Calin GeorgeCalin Data 5 martie 2018 10:16:57
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#define nmax 100002
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");

int aib[nmax];
int val,n,m,vel,x,y,poz;

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

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

int cauta(int val)
{
    int pas;
    for(pas=1;pas<=n;pas<<=1);
    for(int i=0;pas;pas>>=1)
    {
        if(i+pas<=n&&aib[i+pas]<=val)
        {
            val-=aib[i+pas];
            i+=pas;
            if(!val)
                return i;
        }
    }
    return -1;
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>val,update(i);
    for(int i=1;i<=m;i++)
    {
        fin>>vel;
        if(vel==2)
        {
            fin>>val;
            fout<<cauta(val)<<"\n";
        }
        if(vel==1)
        {
            fin>>x>>y;
            fout<<query(y)-query(x-1)<<"\n";
        }
        if(vel==0)
        {
            fin>>poz>>val;
            update(poz);
        }
    }
    return 0;
}