Cod sursa(job #1250903)

Utilizator cristian.caldareaCaldarea Cristian Daniel cristian.caldarea Data 28 octombrie 2014 18:40:28
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");
const int Dim = 100002;

int n, m;
int aib[Dim];
int x, a, b;

int Sum(int pos);
void Update(int pos, int val);
void Search( int v );
int main()
{
    fin >> n >> m;
    for ( int i = 1; i <= n; ++i )
    {
        fin >> x;
        Update(i, x);
    }
    for ( ; m > 0; --m)
    {
        fin >> x;
        if ( x == 0)
        {
            fin >> a >> b;
            Update( a , b);

        }
        if ( x == 1 )
        {
            fin >> a >> b;
            fout << Sum(b) - Sum(a-1) << '\n';
        }
        if ( x == 2 )
        {
            fin >> a;
            Search(a);
        }
    }
    fin.close();
    fout.close();
    return 0;
}

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

int Sum(int pos)
{
	int suma = 0;
	for ( int i = pos; i; i -= i & -i)
		suma += aib[i];
	return suma;
}
void Search( int v )
{
    int st = 1, dr = n, ss, md;
            do
            {
                md = ( st + dr ) / 2;
                ss = Sum(md);
                if ( ss == v )
                {
                    fout << md << "\n";
                    st = n + 1;
                }
                else
                    if ( ss > v )
                        dr = md - 1;
                    else
                        st = md + 1;
            } while ( st <= dr );
            if ( st != n + 1 )
                fout << "-1\n";
}