Cod sursa(job #2647094)

Utilizator valentinchipuc123Valentin Chipuc valentinchipuc123 Data 3 septembrie 2020 05:50:26
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>
#define zeros(x) ( (x ^ (x - 1)) & x )

using namespace std;

ifstream f ( "aib.in" );
ofstream g ( "aib.out" );

int n, m, t, a, x;
int AIB[100005];

void Add ( int poz, int x )
{
    for ( int i = poz; i <= n; i += zeros ( i ) )
        AIB[i] += x;
}

int Compute ( int poz )
{
    int S = 0;

    for ( int i = poz; i >= 1; i -= zeros ( i ) )
        S += AIB[i];

    return S;
}

int Search ( int val )
{
    int step, i;

    for ( step = 1; step < n; step <<= 1 );

    for ( i = 0; step; step >>= 1 )
    {
        if ( i + step <= n )
        {
            if ( val >= AIB[i + step] )
            {
                i += step;
                val -= AIB[i];

                if ( !val ) return i;
            }
        }
    }

    return -1;
}

int main()
{
    f >> n >> m;

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

    for ( int i = 1; i <= m; i++ )
    {
        f >> t;

        if ( t == 0 )
        {
            f >> a >> x;
            Add ( a, x );
        }

        if ( t == 1 )
        {
            f >> a >> x;
            g << Compute ( x ) - Compute ( a - 1 ) << '\n';
        }

        if ( t == 2 )
        {
            f >> x;
            g << Search ( x ) << '\n';
        }
    }
}