Cod sursa(job #1248924)

Utilizator cristian.caldareaCaldarea Cristian Daniel cristian.caldarea Data 26 octombrie 2014 11:23:03
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 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 Query(int pos);
void Update(int pos, int val);
int 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 << Query(b) - Query(a-1) << '\n';
        }
        if ( x == 2 )
        {
            fin >> a;
            fout << Search(a) << '\n';
        }
    }
    fin.close();
    fout.close();
    return 0;
}

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

int Query(int pos)
{
	int suma = 0;
	for ( int x = pos; x; x -= x & -x)
		suma += aib[x];
	return suma;
}
int Search( int v )
{
    int i = 0, p;

	for ( p = 1; p < n; p <<= 1);

	for ( ; p; p >>= 1)
		if ( i + p <= n && aib[i + p] < v )
			i += p;
    if ( aib[i+1] == v )
        return i + 1;
    else
        return -1;
}