Cod sursa(job #1371541)

Utilizator Mr.DoomRaul Ignatus Mr.Doom Data 3 martie 2015 22:08:10
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
using namespace std;

ifstream is("aib.in");
ofstream os("aib.out");

int n, m, a[100001];
int type;
int position1, value, position2;

void Update(int pos, int val);
int Query(int pos);

int main()
{
    is >> n >> m;
    for ( int i = 1; i <= n; ++i )
    {
        is >> value;
        Update(i, value);
    }

    for ( int i = 1; i <= m; ++i )
    {
        is >> type;
        if ( !type )
        {
            is >> position1 >> value;
            Update(position1, value);
        }
        if ( type == 1 )
        {
            is >> position1 >> position2;
            os << Query(position2) - Query(position1 - 1) << '\n';
        }
        if ( type == 2 )
        {
            is >> value;
            int byte;
            for ( byte = 1; byte < n; byte <<= 1 );
            for ( int pos = 0; byte; byte >>= 1 )
                if ( pos + byte <= n && a[pos + byte] <= value )
                {
                    pos += byte;
                    value -= a[pos];
                    if ( !value )
                    {
                        if ( !pos )
                            os << "-1\n";
                        else
                            os << pos << '\n';
                        break;
                    }
                }
            if ( value )
                os << "-1\n";
        }
    }

    is.close();
    os.close();
    return 0;
}

void Update(int pos, int val)
{
    for ( int i = pos; i <= n; i += i & -i )
        a[i] += val;
}

int Query(int pos)
{
    int s = 0;
    for ( int i = pos ; i; i -= i & -i )
        s += a[i];
    return s;
}