Cod sursa(job #3345851)

Utilizator CheeseEaterHackRoman Alex CheeseEaterHack Data 11 martie 2026 14:10:13
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");


int n, aib[100005], m, x, tip, a, b;

void update(int poz, int val)
{
    while (poz<=n)
    {
        aib[poz]+=val;
        poz+=(poz&(-poz));
    }
}
int query(int a, int b)
{
    if (a!=1)
    {
        return query(1, b)-query(1, a-1);
    }
    int sumatot=0;
    while (b>0)
    {
        sumatot+=aib[b];
        b-=(b&(-b));
    }
    return sumatot;
}

int query2(int a)
{
    int p=1<<17, r=0, sumtot=0, rasp=-1;
    while(p>0)
    {
        if (r+p<=n and sumtot+aib[r+p]==a)
        {
            rasp=r+p;
        }
        if (r+p<=n and sumtot+aib[r+p]<a)
        {
            sumtot+=aib[r+p];
            r+=p;
        }
        p/=2;
    }
    return rasp;
}

int main()
{
    fin>>n>>m;
    for (int i=1; i<=n; i++)
    {
        fin>>x;
        update(i, x);
    }
    for (int i=1; i<=m; i++)
    {
        fin>>tip;
        if (tip==0)
        {
            fin>>a>>b;
            update(a, b);
        }
        else if(tip==1)
        {
            fin>>a>>b;
            fout<<query(a, b)<<'\n';
        }
        else if (tip==2)
        {
            fin>>a;
            fout<<query2(a)<<'\n';
        }
    }


    return 0;
}