Cod sursa(job #2139455)

Utilizator theodor.vladTheodor Vlad theodor.vlad Data 22 februarie 2018 16:07:35
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>

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

int last2(int);
int query(int);
void update(int, int);

int n, m;
int aib[100005];

int main()
{
	int tip, a, b;
	int st, dr, mij, q;

	fin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		fin >> a;
		update(i, a);
	}

	for (int i = 1; i <= m; i++)
	{
		fin >> tip;
		if (tip == 2)
		{
			fin >> a;
			st = 0; dr = n + 1;
			while (dr - st > 1)
			{
				mij = st + (dr - st) / 2;
				q = query(mij);
				if (q < a) st = mij;
				else dr = mij;
			}
			if (query(dr) == a)
				fout << dr << '\n';
			else fout << "-1\n";
		}
		else
		{
			fin >> a >> b;
			if (tip == 0) update(a, b);
			else fout << query(b) - query(a - 1) << '\n';
		}
	}
	return 0;
}

int query(int pos)
{
	int sum = 0;
	for (int i = pos; i; i -= last2(i))
		sum += aib[i];
	return sum;
}

void update(int pos, int val)
{
	for (int i = pos; i <= n; i += last2(i))
		aib[i] += val;
}

int last2(int x)
{
	return x & (x ^ (x - 1));
}