Cod sursa(job #3154374)

Utilizator elisa.ipateElisa Ipate elisa.ipate Data 4 octombrie 2023 14:50:36
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>


using namespace std;

#define nmax 100005

int aib[nmax], n;

void update( int poz, int val ) {
    while( poz <= n ) {
        aib[poz] += val;
        poz += (-poz)&poz;
    }
}

int query( int poz ) {
    int s = 0;

    while( poz > 0 ) {
        s+= aib[poz];
        poz -= poz&(-poz);
    }
    return s;
}

int cautbin( int l, int r, int val ) {
    if( r - l <= 1 )
        return l;
    else {
        int mij = (l+r)/2;
        int valm = query(mij);
        if( valm >= val ) {
            return cautbin( l, mij, val );
        } else {
            return cautbin( mij, r, val );
        }
    }
}
int main()
{
    int m, i, x, j, cer, a, b, rez;
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    cin >> n >> m;
    for( i = 1; i <= n; i++ ) {
        cin >> x;
        update( i, x );
    }
    for( j = 0; j < m; j++ ) {
        cin >> cer;
        if( cer == 0 ) {
            cin >> a >> b;
            update( a, b );
        } else if( cer == 1 ) {
            cin >> a >> b;
            cout << query(b) - query(a-1) << "\n";
        } else {
            cin >> a;
            rez = cautbin( 0, n, a ) + 1;
            if( query(rez) == a )
                cout << rez << "\n";
            else
                cout << "-1\n";
        }
    }
    return 0;
}