Cod sursa(job #386677)

Utilizator alexandru92alexandru alexandru92 Data 25 ianuarie 2010 17:44:52
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
/* 
 * File:   main.cpp
 * Author: virtualdemon
 *
 * Created on January 25, 2010, 3:00 PM
 */
#include <vector>
#include <iostream>
#include <fstream>

/*
 *
 */
using namespace std;
typedef unsigned int u;
vector<u> v;
void Update( u from, u with )
{
    for( u n=v.size(); from <= n; )
    {
        v[from]+=with;
        from+=( from & -from );
    }
}
u Sum( u from )
{u s=0;
    for(; from > 0;  )
    {
       s+=v[from];
       from-=(from & -from );
    }
    return s;
}
inline u min( u x, u y )
{
    return y^( (x^y) & -(x<y) );
}
int Search( u x )
{
    u from=0, bitmask, at, n=v.size();
    for( bitmask=1; bitmask < n; bitmask<<=1 );
    for( ; bitmask && from < n; bitmask>>=1 )
    {
        at=from+bitmask;
        if( at < n )
        {
            if( x == v[at] )
                return at;
            if( x > v[at] )
            {
                from=at;
                x-=v[at];
            }
        }
    }
    if( x )
      return -1;
    return from;
}
int main()
{
    u n, m, i, x, y, op;
    ifstream in("aib.in");
    in>>n>>m;
    v.resize(n+1);
    for( i=1; i <= n; ++i )
    {
        in>>x;
        Update( i, x );
    }
    ofstream out("aib.out");
    for( i=0; i < m; ++i )
    {
        in>>op>>x;
        if( op < 2 )
        {
            in>>y;
            if( 0 == op )
                Update( x, y );
            else out<<( Sum(y) - Sum(x-1) )<<'\n';
        }
        else out<<Search(x)<<'\n';
    }
    
    return 0;
}