Cod sursa(job #2735666)

Utilizator SergiuS3003Sergiu Stancu Nicolae SergiuS3003 Data 2 aprilie 2021 17:55:58
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
ifstream f ( "aib.in" );
ofstream g ( "aib.out" );
const int NMAX = 100000;
int N, AiB[NMAX + 1];
void add ( int poz, int val )
{
    while ( poz <= N )
    {
        AiB[poz] += val;
        poz += poz & ( -poz );
    }
}
int sum ( int poz )
{
    int  s = 0;

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

    return s;
}
int bsearch ( int val )
{
    int p = 1, u = N, poz = -1;

    while ( p <= u )
    {
        int m = ( p + u ) >> 1, s = sum ( m );

        if ( s < val )
            p = m + 1;
        else
        {
            if ( s == val )
                poz = m;

            u = m - 1;
        }
    }

    return poz;
}
int main()
{
    int M, op, x, y;
    f >> N >> M;

    for ( int i = 1; i <= N; i++ )
    {
        f >> x;
        add ( i, x );
    }

    while ( M-- )
    {
        f >> op;

        switch ( op )
        {
        case 0:
            f >> x >> y;
            add ( x, y );
            break;

        case 1:
            f >> x >> y;
            g << sum ( y ) - sum ( x - 1 ) << '\n';
            break;

        case 2:
            f >> x;
            g << bsearch ( x ) << '\n';
        }
    }

    return 0;
}