Cod sursa(job #2378355)

Utilizator vladsirbu23Vlad Sirbu vladsirbu23 Data 12 martie 2019 08:50:42
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n,m,d[100010],cod,aux;
int bitmin(int poz)
{
    return (poz&(-poz));
}
void upd(int poz,int val)
{
    while(poz<=n)
    {
        d[poz]+=val;
        poz+=bitmin(poz);
    }
}
int que(int poz)
{
    int s=0;
    while(poz>0)
    {
        s+=d[poz];
        poz-=bitmin(poz);
    }
    return s;
}
int rez(int s)
{
    int l=aux,baza=0;
    for(l=aux; l!=0; l=l>>1)
    {
        if(d[baza+l]<=s&&baza+l<=n)
        {
            baza+=l;
            s=s-d[baza];
            if(s==0)
                return baza;
        }
    }
    return -1;
}
int main()
{
    int val,poz1,poz2,i,s,poz;
    fin>>n>>m;
    poz=1;
    while(poz<=n)
    {
        aux=poz;
        poz=poz<<1;
    }
    for(i=1; i<=n; i++)
    {
        fin>>val;
        upd(i,val);
    }
    for(i=1; i<=m; i++)
    {

        fin>>cod;
        if(cod==0)
        {
            fin>>poz>>val;
            upd(poz,val);
        }
        else
        {
            if(cod==1)
            {
                fin>>poz1>>poz2;
                fout<<que(poz2)-que(poz1-1)<<'\n';
            }
            else
            {
                fin>>s;
                fout<<rez(s)<<'\n';
            }
        }
    }
}