Cod sursa(job #1619246)

Utilizator qwertyuiTudor-Stefan Berbinschi qwertyui Data 28 februarie 2016 14:15:03
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin ("aib.in");
ofstream fout ("aib.out");

#define MAXN 100005

int aib[MAXN], N, M;

void Update (int pos, int value)
{
    while (pos <= N)
	{
        aib[pos] += value;
        pos += (pos&(-pos));
	}
}

int Query (int pos)
{
    int s;
    s = 0;
    while (pos > 0)
	{
		s += aib[pos];
		pos -= (pos&(-pos));
	}
	return s;
}

int Position (int value)
{
    int left = 1, right = N;
    while (left <= right)
	{
        int middle = (left + right) / 2;
        int sum = Query(middle);
        if (sum == value)
			return middle;
		if (sum > value)
			right = middle - 1;
		else
			left = middle + 1;
	}

}

int main()
{
    fin >>N >>M;

    for (int i = 1; i <= N; ++i)
	{
        int x;
        fin >>x;
        Update(i, x);
	}

	for (int i = 1; i <= M; ++i)
	{
        int cod, x, y;
        fin >>cod;

        if (cod == 0)
		{
            fin >>x >>y;
            Update(x, y);
		}

		if (cod == 1)
		{
            fin >>x >>y;
            fout <<Query(y) - Query(x-1) <<'\n';
		}

		if (cod == 2)
		{
            fin >>x;
            fout <<Position(x) <<'\n';
		}

	}

    return 0;
}