Cod sursa(job #2550449)

Utilizator XsoundCristian-Ioan Roman Xsound Data 18 februarie 2020 20:00:01
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 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 sum )
{
    int lim = log2(n);
    int st = -1, dr = lim+1, mij, i;

    while ( dr-st > 1 )
    {
        mij = (st + dr) / 2;

        i = 1 << mij;

        if ( aib[i] <= sum )
            st = mij;

        else
            dr = mij;
    }

    if ( aib[(1<<st)] == sum )
        return (1<<st);

    st = ( 1 << st )+1;
    dr = ( 1 << dr );

    LL S = 0;

    while ( dr-st > 1 )
    {
        mij = st + (st&(-st));

        if ( mij > dr )
        {
            S = aib[st];
            st++;
            continue;
        }

        if ( S+aib[mij] <= sum )
            st = mij;

        else
            dr = mij;
    }

    return st;
}

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