Cod sursa(job #3372591)

Utilizator Andreea1501013Andreea Andreea1501013 Data 4 noiembrie 2026 12:48:50
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
#define ll long long

using namespace std;
ll v[100005], aib[100005], N;

int lsb(int nr)
{
    return (nr & (-nr));
}

void update(int p, int x)
{
    for(int i = p; i <= N; i += lsb(i))
    {
        aib[i] += x;
    }
}

int query(int x)
{
    ll sum = 0;
    for(int i = x; i > 0; i -= lsb(i))
    {
        sum += aib[i];
    }
    return sum;
}

bool check(int p, int val)
{
    return query(p) < val;
}

int cautareBinara(int a)
{
    /// fac cautare binara cu pas pt ca de ce nu
    int sol = 0;
    for(int b = 20; b >= 0; b--)
    {
        if((sol + (1<<b)) <= N && check(sol + (1 << b), a))
        {
            sol += (1<<b);
        }
    }
    sol++;
    if(a == query(sol))
    {
        return sol;
    }
    return -1;
}

int main()
{
    ifstream cin("aib.in");
    ofstream cout("aib.out");

    int M,op,a,b;
    cin>>N>>M;
    for(int i = 1; i <= N; i++)
    {
        cin>>v[i];
        update(i,v[i]);
    }
    while(M--)
    {
        cin>>op>>a;
        if(op == 2)
        {
            cout<<cautareBinara(a)<<'\n';
            continue;
        }
        cin>>b;
        if(op == 0)
        {
            v[a] += b;
            update(a,b);
            continue;
        }
        cout<< query(b) - query(a-1)<<'\n';

    }
    return 0;
}