Cod sursa(job #3161314)

Utilizator elisa.ipateElisa Ipate elisa.ipate Data 26 octombrie 2023 16:56:26
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.04 kb
#include <fstream>
#include <iostream>

#define MAXN 400000

using namespace std;

int v[MAXN], aint[4*MAXN];
int ans;

int minp2 ( int n ) {
    int x = 1;
    while( x < n )
        x *= 2;
    return x;
}

void init( int nod, int l, int r ) {
    if( r == l )
        aint[nod] = v[r];
    else {
        init( nod*2, l, (l+r)/2 );
        init( nod*2+1, (l+r)/2+1, r );
        aint[nod] = aint[nod*2] + aint[nod*2+1];
    }

}

void update( int nod, int l, int r, int poz, int val ) {
    if( l <= poz && poz <= r ) {
        if( r == l )
            aint[nod] = v[r];
        else {
            update( nod*2, l, (l+r)/2, poz, val );
            update( nod*2+1, (l+r)/2+1, r, poz, val );
            aint[nod] = aint[nod*2] + aint[nod*2+1];
        }
    }

}

void query( int nod, int l, int r, int lq, int rq ) {
    if( lq <= l && rq >= r )
        ans += aint[nod];
    else if( rq < l || lq > r )
        return;
    else{
        query( nod*2, l, (l+r)/2, lq, rq );
        query( nod*2+1, (l+r)/2+1, r, lq, rq );
    }

}

int cautbin( int nod, int l, int r, int val, int s ) {
    if( l == r ) {
        if( val == s + v[l] )
            return l;
        else
            return -1;
    }
    int mid = (l + r) / 2;
    if( s + aint[nod*2] >= val )
        return cautbin( nod*2, l, mid, val, s );
    s += aint[nod*2];
    return cautbin( nod*2+1, mid+1, r, val, s);

}

int main() {
    int m, n, i, a, b, t;
    ifstream cin( "aib.in" );
    ofstream cout( "aib.out" );
    cin >> n >> m;
    for( i = 0; i < n; i++ )
        cin >> v[i];
    //n = minp2( n );
    init( 1, 0, n-1 );
    for( i = 0; i < m; i++ ) {
        cin >> t;
        if( t == 0 ) {
            cin >> a >> b;
            v[a-1] += b;
            update( 1, 0, n-1, a-1, b );
        } else if( t == 1 ) {
            cin >> a >> b;
            ans = 0;
            query( 1, 0, n-1, a-1, b-1 );
            cout << ans;
            cout << "\n";
        } else {
            cin >> a;
            cout << cautbin( 1, 0, n-1, a, 0 ) + 1;
            cout << "\n";
        }

    }

    return 0;
}