Cod sursa(job #2883561)

Utilizator matei8787Matei Dobrea matei8787 Data 1 aprilie 2022 16:49:41
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include<bits/stdc++.h>
using namespace std;
int aib[100005];
int n, m;
int lsb(int i)
{
    return (~i + 1) & i;
}
void citire()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for ( int i = 1 ; i <= n ; i++ )
    {
        int aux;
        scanf("%d", &aux);
        aib[i] += aux;
        int j = i + lsb(i);
        if ( j <= n )
        {
            aib[j] += aib[i];
        }
    }
}
void afisare()
{
    for ( int i = 1 ; i <= n ; i++ )
    {
        cout<<aib[i]<<" ";
    }
}
void q1(int a, int b)
{
    int i = a;
    while ( i <= n )
    {
        aib[i] += b;
        i += lsb(i);
    }
}
int sumPref(int x) ///suma [1, x]
{
    int ans = 0;
    int i = x;
    while ( i > 0 )
    {
        ans += aib[i];
        i -= lsb(i);
    }
    return ans;
}
void q2(int a, int b)
{
    cout<<sumPref(b) - sumPref(a-1)<<'\n';
}
void q3(int a)
{
    int st, dr;
    st = 1;
    dr = n;
    int ans = INT_MAX;
    while ( st <= dr )
    {
        int mij = ( st + dr ) / 2;
        int aux = sumPref(mij);
        if ( aux >= a )
        {
            if ( aux == a )
            {
                ans = min(ans, mij);
            }
            dr = mij - 1;
        }
        else
        {
            st = mij + 1;
        }
    }
    cout<<ans<<'\n';
}
void rez()
{
    for ( int i = 1 ; i <= m ; i++ )
    {
        int c;
        scanf("%d", &c);
        if ( c == 0 )
        {
            int a, b;
            scanf("%d%d", &a, &b);
            q1(a,b);
        }
        else if ( c == 1 )
        {
            int a, b;
            scanf("%d%d", &a, &b);
            q2(a,b);
        }
        else
        {
            int a;
            scanf("%d", &a);
            q3(a);
        }
    }
}
int main()
{
    citire();
    rez();
    return 0;
}