Cod sursa(job #2035082)

Utilizator trifangrobertRobert Trifan trifangrobert Data 8 octombrie 2017 21:48:35
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <conio.h>

#include <fstream>
#define DIM 100010

using namespace std;

int n, m;
int aib[DIM];

void Update(int poz, int val)
{
	while (poz <= n)
	{
		aib[poz] += val;
		poz += (poz & (-poz));
	}
}

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

int Query2(int val)
{
	int left = 1, right = n, mid, poz = -1;
	while (left <= right)
	{
		mid = (left + right) / 2;
		int x = Query1(mid);
		if (x == val)
		{
			poz = mid;
			right = mid - 1;
		}
		else
		{
			if (x < val)
				left = mid + 1;
			else
				right = mid - 1;
		}
	}
	return poz;
}

int main()
{
	ifstream f("aib.in");
	ofstream g("aib.out");
	f >> n >> m;
	for (int i = 1;i <= n;++i)
	{
		int x;
		f >> x;
		Update(i, x);
	}
	for (int i = 1;i <= m;++i)
	{
		int id;
		f >> id;
		switch (id)
		{
			case 0:
			{
				int poz, val;
				f >> poz >> val;
				Update(poz, val);
				break;
			}
			case 1:
			{
				int left, right;
				f >> left >> right;
				left = Query1(left - 1);
				right = Query1(right);
				g << right - left << "\n";
				break;
			}
			case 2:
			{
				int k;
				f >> k;
				g << Query2(k) << "\n";
				break;
			}
		}
	}
	f.close();
	g.close();
	return 0;
}