Cod sursa(job #308175)

Utilizator alex23alexandru andronache alex23 Data 26 aprilie 2009 11:48:24
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>


FILE *f = fopen("arbint.in", "r"), *g = fopen("arbint.out", "w");

int *a, maxim = -1, start, finish, N, M;
long n = 0;

using namespace std;

int update(int i, int x)
{
	int li = 0, ls = N - 1, poz = 0;
	if (a[poz] < x)
	{
		a[poz] = x;
	}
	while ((li < ls) && (ls))
	{
		int m = (li + ls) / 2;
		if (i <= m)
		{
			ls = m;
			poz = 2 * poz + 1;
			if (a[poz] < x) a[poz] = x;
		}
		else
		{
			li = m + 1;
			poz = 2 * poz + 2;
			if (a[poz] < x) a[poz] = x;
		}
	}
	a[poz] = x;
	while (poz)
	{
		int t = (poz - 1) / 2;
		a[t] = max(a[2 * t + 1], a[2 * t + 2]);
		poz = (poz - 1) / 2;
	}
	return 0;
}

void query(int nod, int li, int ls)
{
	if ((start <= li) && (ls <= finish))
	{
		if (a[nod] > maxim) maxim = a[nod];
		return ;
	}
	int m = (li + ls) / 2;
	if (start <= m) query(2 * nod + 1, li, m);
	if (finish >= m + 1) query(2 * nod + 2, m + 1, ls);

}

int main()
{
	fscanf(f, "%d %d", &N, &M);
	
	int j = 1;
	while (j < 2 * N)
	{
		n += j;
		j *= 2;
	}
	a = new int[n];
	for (int i = 0; i < n; ++i)
	{
		a[i] = 0;
	}
	for (int i = 0; i < N; ++i)
	{
		int x;
		fscanf(f, "%d", &x);
		update(i, x);
	}
	for (int i = 0; i < M; ++i)
	{
		int x, y, z;
		fscanf(f, "%d %d %d", &x, &y, &z);
		if (x)
		{
			update(y - 1, z);
		}
		else
		{
			maxim = -1;
			start = y - 1;
			finish = z - 1;
			query(0, 0, N - 1);
			fprintf(g, "%d\n", maxim);
		}
	}
	fclose(f);
	fclose(g);

	delete[] a;

	return 0;
}