Cod sursa(job #3343771)

Utilizator robertcosacCosac Robert-Mihai robertcosac Data 28 februarie 2026 13:54:04
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int aib[100009], v[100009];
int n;
int p[22];
void update (int poz, int add)
{
    for (int i=poz; i<=n; i+=i&-i)
        aib[i]+=add;
}
int querysum (int poz)
{
    int ans=0;
    for (int i=poz; i>=1; i-=i&-i)
        ans+=aib[i];
    return ans;
}
int querykth (int k)
{
    int poz=0;
    bool ok=0;
    int i=20;
    while (i>=0)
    {
        while (i>=0 && poz+p[i]>n)
            i--;
        if (aib[poz+p[i]]<k)
            k-=aib[poz], poz+=p[i];
        else if (aib[poz+p[i]]==k)
            ok=1;
        i--;
    }
    if (ok)
        return poz+1;
    return -1;
}
signed main ()
{
    p[0]=1;
    for (int i=1; i<=20; i++)
        p[i]=2*p[i-1];
    int q;
    f >> n >> q;
    for (int i=1; i<=n; i++)
        f >> v[i], update (i, v[i]);
    while (q--)
    {
        int tip;
        f >> tip;
        if (tip==2)
        {
            int k;
            f >> k;
            g << querykth(k)<<'\n';
        }
        else
        {
            int x, y;
            f >> x >> y;
            if (!tip)
                update (x, y);
            else
                g << querysum(y)-querysum(x-1) <<'\n';
        }
    }
}