Cod sursa(job #2664251)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 28 octombrie 2020 11:13:22
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin( "aib.in" );
ofstream fout( "aib.out" );

const int NMAX = 100005;
const int INF = 2000000000;

int N, Q;
int t[NMAX];

void Update( int p, int val ) {
    while( p <= N ) {
        t[p] += val;
        p += p & ( -p );
    }
}

int Query( int p ) {
    int ans = 0;

    while( p > 0 ) {
        ans += t[p];
        p -= p & ( -p );
    }
    return ans;
}

int BinSearch( int lf, int rg, int val ) {
    if( lf > rg ) return INF;

    int mid = lf + ( rg - lf ) / 2;

    if( Query( mid ) > val ) return BinSearch( lf, mid - 1, val );
    else
        if( Query( mid ) == val ) return min( mid, BinSearch( lf, mid - 1, val ) );
        else return BinSearch( mid + 1, rg, val );
}

void Read() {
    fin >> N >> Q;

    int tmp;
    for( int i = 1; i <= N; ++i ) {
        fin >> tmp;
        Update( i, tmp );
    }

    int task, a, b;
    for( int i = 1; i <= Q; ++i ) {
        fin >> task >> a;
        if( task < 2 ) fin >> b;

        if( task == 0 ) Update( a, b );
        if( task == 1 ) fout << Query( b ) - Query( a - 1 ) << '\n';
        if( task == 2 ) {
            int ans = BinSearch( 1, N, a );

            if( ans == INF ) fout << "-1\n";
            else fout << ans << '\n';
        }
    }
}

int main()
{
    Read();

    return 0;
}