Cod sursa(job #2779718)

Utilizator vmnechitaNechita Vlad-Mihai vmnechita Data 4 octombrie 2021 19:26:42
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <bits/stdc++.h>
#define NMAX 100005

using namespace std;

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

int n, a[NMAX];

void update ( int poz, int val );
int sum ( int st, int dr );

int main()
{
    int t, i, c, x, y, r, st, dr, mij, s[NMAX];

    fin >> n >> t;
    s[0] = 0;
    for ( i = 1; i <= n; i++ )
    {
        fin >> x;
        s[i] = s[i-1] + x;
        if ( i % 2 == 1 ) a[i] = x;
        else a[i] = s[i] - s[i-((i^(i-1))&i)];
    }

    while ( t-- )
    {
        fin >> c;
        if ( c == 0 )
        {
            fin >> x >> y;
            update ( x, y );
        }
        else if ( c == 1 ) fin >> x >> y, fout << sum ( x, y ) << '\n' ;
        else
        {
            fin >> x;
            r = -1;
            st = 1, dr = n;
            while ( st <= dr )
            {
                mij = ( st + dr ) / 2;
                if ( sum ( 1, mij ) < x ) st = mij + 1;
                else if ( sum ( 1, mij ) == x ) r = mij, dr = mij - 1;
                else dr = mij - 1;
            }
            fout << r << '\n';
        }
    }

    return 0;
}

void update ( int poz, int val )
{
    while ( poz + ( poz ^ ( poz - 1 ) & poz ) <= n )
    {
        a[poz] += val;
        poz += poz ^ ( poz - 1 ) & poz;
    }

    a[poz] += val;
}

int sum ( int st, int dr )
{
    int r;

    if ( st != 1 ) return sum ( 1, dr ) - sum ( 1, st - 1 );
    else if ( st == 1 && dr == 1 ) return a[1];
    else
    {
        r = 0;
        while ( dr != 0 )
        {
            if ( dr % 2 == 1 ) r += a[dr], dr--;
            else
            {
                r += a[dr];
                dr -= ( dr ^ ( dr - 1 ) & dr );
            }
        }

        return r;
    }
}