Cod sursa(job #3248136)

Utilizator ana.veronica13Ana Veronica Draghici ana.veronica13 Data 10 octombrie 2024 21:14:12
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>

#define MAX_N 100000

using namespace std;

int v[MAX_N + 5], n;

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

int prefixSum( int i ){
    int sum = 0;
    while( i > 0 ){
        sum += v[i];
        i -= ( i & -i );
    }
    return sum;
}

int rangeSum( int i, int j ){
    return prefixSum( j ) - prefixSum( i - 1 );
}

int main(){
    ifstream cin( "aib.in" );
    ofstream cout( "aib.out" );
    int m, i, o, a, b, ans, mij, st, dr;
    cin >> n >> m;
    for( i = 1; i <= n; i++ ){
        cin >> a;
        update( i, a );
    }
    for( i = 1; i <= m; i++ ){
        cin >> o >> a;
        if( o == 0 ){
            cin >> b;
            update( a, b );
        }else if( o == 1 ){
            cin >> b;
            cout << rangeSum( a, b ) << "\n";
        }else{
            st = 1;
            dr = ans = n;
            while( st <= dr ){
                mij = ( st + dr ) / 2;
                if( prefixSum( mij ) < a )
                    st = mij + 1;
                else if( prefixSum(mij) >= a ){
                    ans = mij;
                    dr = mij - 1;
                }
            }
            if( prefixSum(ans) != a )
              cout << "-1\n";
            else
              cout << ans << "\n";
        }
    }
    return 0;
}