Cod sursa(job #2844967)

Utilizator 7h35up3rPr0Sus Amogus 7h35up3rPr0 Data 6 februarie 2022 16:58:08
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
int x,n,m,op,a,b,k,r;
int aib[100001];
void update(int pos,int val);
int query(int pos);
int cautare(int sum);
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        fin>>a;
        update(i,a);
    }
    for(int i=1;i<=m;i++)
    {
        fin>>op;
        if(op==0)
        {
            fin>>a>>b;
            update(a,b);
        }
        if(op==1)
        {
            fin>>a>>b;
            fout<<(query(b)-query(a-1))<<'\n';
        }
        if(op==2)
        {
            fin>>a;
            k=cautare(a);
            if(query(k)==a)
                fout<<k<<'\n';
            else
                fout<<-1<<'\n';
        }
    }
    fin.close();
    fout.close();
    return 0;
}
void update(int pos,int val)
{
    while(pos<=n)
    {
        aib[pos]+=val;
        pos+=(pos&(-pos));
    }
    return;
}
int query(int pos)
{
    int rez=0;
    while(pos!=0)
    {
        rez+=aib[pos];
        pos-=pos&(-pos);
    }
    return rez;
}
int cautare(int sum)
{
    int p=1;
    while(p*2<=n)
        p*=2;
    int pos=1;
    while(p)
    {
        if(query(pos+p-1)<sum&&pos+p-1<=n)
            pos+=p;
        p/=2;
    }
    return pos;
}