Cod sursa(job #386656)

Utilizator alexandru92alexandru alexandru92 Data 25 ianuarie 2010 16:52:48
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 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 )
{
    u p=0;
    for( u n=v.size(); from <= n; )
    {
        v[from]+=with;
        for( ; !( (from) & (1<<p) ); ++p );
        from+=(1<<p);
        p+=1;
    }
}
u Sum( u from )
{u s=0, p=0;
    for(; from > 0;  )
    {
       s+=v[from];
       for( ; !( (from) & (1<<p) ); ++p );
       from-=(1<<p);
       p+=1;
    }
    return s;
}
int Search( u x )
{
    int poz=-1;
    u left=1, right=v.size()-1, y, m;
    if( x == Sum(right) )
        return right;
    if( x == Sum(left ) )
        return left;
    while( left < right )
    {
        m=left+(right-left)/2;
        y=Sum(m);
        if( y == x )
        {
            if( -1 == poz || m < poz )
                poz=m;
        }
        if( y >= x )
            right=m;
        else left=m+1;
    }
    return poz;
}
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;
}