Cod sursa(job #2574110)

Utilizator vmnechitaNechita Vlad-Mihai vmnechita Data 5 martie 2020 20:23:12
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>
#define NMAX 100005

using namespace std;

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

int v[NMAX], s[NMAX], c[NMAX];

int putere2k ( int x );
int sum ( int x );

int main()
{
    int n, q, i, p, x, y, a, st, dr, mij, r;

    fin >> n >> q;
    for ( i = 1 ; i <= n ; i++ ) fin >> v[i], s[i] = s[i-1] + v[i];

    for ( i = 1 ; i <= n ; i += 2 ) c[i] = v[i];
    for ( i = 2 ; i <= n ; i += 2 ) c[i] = s[i] - s[i-putere2k(i)];

    while ( q-- )
    {
        fin >> p >> x;
        if ( p == 0 )
        {
            fin >> y;
            for ( i = x ; i <= n ; i += putere2k ( i ) ) c[i] += y;
        }
        else if ( p == 1 )
        {
            fin >> y;
            a = 0;
            for ( i = y ; i > 0 ; i -= putere2k ( i ) ) a += c[i];
            for ( i = x - 1 ; i > 0 ; i -= putere2k ( i ) ) a -= c[i];

            fout << a << '\n';
        }
        else
        {
            r = -1;
            st = 1;
            dr = n;
            while ( st <= dr )
            {
                mij = ( st + dr ) / 2;
                if ( sum ( mij ) == x ) r = mij, dr = mij - 1;
                else if ( sum ( mij ) > x ) dr = mij - 1;
                else st = mij + 1;
            }

            fout << r << '\n';
        }
    }

    return 0;
}

int putere2k ( int x )
{
    return x & ( x ^ ( x - 1 ) );
}

int sum ( int x )
{
    int i, s = 0;

    for ( i = x ; i > 0 ; i -= putere2k ( i ) ) s += c[i];

    return s;
}