Cod sursa(job #3366609)

Utilizator RZV139fjDragomir Ioan Razvan RZV139fj Data 2 octombrie 2026 18:18:42
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.38 kb
#include <bits/stdc++.h>
const int maxN=100000;
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");

struct node{
    int val;
};
int vec[maxN];

int putere2(int n)
{
   return 1<<(32-__builtin_clz(n-1));
}
int putere2idx(int n)
{
   return 32-__builtin_clz(n-1);
}


struct aib{
    node v[maxN];
    int n;
    int Maxpow2,Maxpow2idx;

    void init(int lung)
    {
        n=lung;
        Maxpow2=putere2(n);
        Maxpow2idx=putere2idx(n);
        for(int i=1;i<=n;i++)
        {
            v[i].val=0;
        }
    }

    void add(int poz,int el)
    {
        while(poz<=n)
        {
            v[poz].val+=el;
            poz=poz+(poz&(-poz));
        }
    }

    void build()
    {
        for(int i=1;i<=n;i++)
        {
            add(i,vec[i]);
        }
    }

    int prefixSum(int poz)
    {
        int s=0;
        while(poz>0)
        {
            s+=v[poz].val;
            poz&=poz-1;
        }
        return s;
    }
    int rangeSum(int l, int r)
    {
        return prefixSum(r)-prefixSum(l-1);
    }

    int binarSum(int a)
    {
        int cmp=Maxpow2idx;
        cmp=1<<cmp;
        int poz=cmp;
        while(cmp>0)
        {
            if(a==v[poz].val and poz<=n)
            {
                return poz;
            }
            if(a<v[poz].val || poz>n)
            {
                cmp/=2;
                poz=poz-cmp;
            }
            else
            {

                a-=v[poz].val;
                cmp/=2;
                poz+=cmp;

            }
        }
        return -1;
    }
};
aib arbore;
int main()
{
    int n,q;
    fin>>n>>q;

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    for(int i=1;i<=n;i++)
    {
        fin>>vec[i];
    }

    arbore.init(n);
    arbore.build();

    for(int i=1;i<=q;i++)
    {
        int tip;
        fin>>tip;
        if(tip==0)
        {
            int poz,val;
            fin>>poz>>val;
            arbore.add(poz,val);
        }
        else if(tip==1)
        {
            int l,r;
            fin>>l>>r;
            int sum=arbore.rangeSum(l,r);
            fout<<sum<<'\n';
        }
        else
        {
            int a;
            fin>>a;
            int k=arbore.binarSum(a);
            fout<<k<<'\n';
        }

    }

    return 0;
}