Cod sursa(job #180633)

Utilizator diac_paulPaul Diac diac_paul Data 17 aprilie 2008 12:20:02
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <stdio.h>
#define NMax 100005
#define maxim(a, b) ( (a > b) ? a : b )

int n, m, ar[2*NMax];

void update(int nod, int in, int sf, int pos, int val);
int querry(int nod, int in, int sf, int a, int b);

int main()
{
	int i, x, t, a, b;
	FILE *fin = fopen("arbint.in", "rt");
	FILE *fout = fopen("arbint.out", "wt");
	
	fscanf(fin, "%d %d", &n, &m);

	for (i = 1; i <= n; i++)
	{
		fscanf(fin, "%d", &x);
		update(1, 1, n, i, x);
	}

	for (i = 1; i <= m; i++)
	{
		fscanf(fin, "%d %d %d", &t, &a, &b);

		if (t)
		{
			update(1, 1, n, a, b);
		}
		else
		{
			fprintf(fout, "%d\n", querry(1, 1, n, a, b));
		}
	}

	fclose(fin);
	fclose(fout);

	return 0;
}

int mi;
void update(int nod, int in, int sf, int pos, int val)
{
	if (in == sf)
	{
		ar[nod] = val;
	}
	else
	{
		mi = (in + sf) / 2;

		if (pos <= mi)
			update(2*nod, in, mi, pos, val);
		else
			update(2*nod+1, mi+1, sf, pos, val);

		ar[nod] = maxim(ar[2*nod], ar[2*nod+1]);
	}
}

int querry(int nod, int in, int sf, int a, int b)
{
	if (a <= in && b >= sf)
		return ar[nod];

	mi = (in + sf) / 2;

	if (a <= mi && b >= mi + 1)
		return maxim(querry(2*nod, in, mi, a, b), querry(2*nod+1, mi+1, sf, a, b));
	
	if (a <= mi)
		return querry(2*nod, in, mi, a, b);
	//if (b >= mi + 1)
		return querry(2*nod+1, mi+1, sf, a, b);
}