Cod sursa(job #2550537)

Utilizator XsoundCristian-Ioan Roman Xsound Data 18 februarie 2020 20:52:55
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>
#define Nmax 100005
using namespace std;
ifstream fin ( "aib.in" );
ofstream fout ( "aib.out" );
typedef long long int LL;

void Read ( );
void Add ( int i, LL val );
LL Querry ( int i, int j );
int Caut ( LL sum );

LL aib[Nmax];

int n, m;

int main ( )
{
    Read ( );
}

void Add ( int i, LL val )
{
    while ( i <= n )
    {
        aib[i] += val;

        i += (i&(-i));
    }

    return ;
}

LL Querry ( int i, int j)
{
    LL sum1, sum2;

    sum1 = sum2 = 0;

    while ( j > 0 )
    {
        sum2 += aib[j];

        j -= ( j & (-j) );
    }

    i--;

    while ( i > 0 )
    {
        sum1 += aib[i];
        i-= ( i & (-i) );
    }

    return sum2-sum1;
}

int Caut ( LL val )
{
     int i, step;

    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;
}

void Read ( )
{
    LL a, b, task;

    fin >> n >> m;

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

    for ( int i = 1; i <= m; i++ )
    {
        fin >> task >> a;

        if ( task == 0 )
        {
            fin >> b;
            Add ( a, b );
        }

        else if ( task == 1 )
        {
            fin >> b;
            fout << Querry ( a, b ) << '\n';
        }

        else
            fout << Caut ( a ) << '\n';
    }
}