Cod sursa(job #2709228)

Utilizator pimao2004Lupu Stefan Dragos pimao2004 Data 20 februarie 2021 01:14:28
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>

using namespace std;
ifstream in ("aib.in");
ofstream out ("aib.out");
int teme_no[100001];
int tsuke_wa[100001];
int n;
int next(int a)
{
    return (a&(-a));
}
void kane_dewa(int val,int pos)
{
    while(pos<=n)
    {
        tsuke_wa[pos]+=val;
        pos+=next(pos);
    }
}
int haraene_ze(int pos)
{
    int sum=0;
    while(pos)
    {
        sum=sum+tsuke_wa[pos];
        pos-=next(pos);
    }
    return sum;
}
int ORA(int yare_yare)
{
    int put=1;
    while(put<=n)
        put<<=1;
    int i=0;
    while(put)
    {
        if(i+put<=n&&tsuke_wa[i+put]<=yare_yare)
        {
            i+=put;
            yare_yare-=tsuke_wa[i];
            if(!yare_yare)
                return i;
            else if(yare_yare<0)
                return -1;
        }
        put>>=1;
    }
    return -1;
}
int main()
{
    int m;
    in>>n>>m;
    int x;
    int q;
    int a,b;
    for(int i=1;i<=n;i++)
    {
        in>>teme_no[i];
        kane_dewa(teme_no[i],i);
    }
    for(int i=1;i<=m;i++)
    {
        in>>q;
        if(q==0)
        {
            in>>a>>b;
            kane_dewa(b,a);
        }
        else if(q==1)
        {
            in>>a>>b;
            out<<haraene_ze(b)-haraene_ze(a-1);
        }
        else if(q==2)
        {
            in>>a;
            out<<ORA(a);
        }
        if(q)
            out<<'\n';
    }
    return 0;
}