Cod sursa(job #165338)

Utilizator anoukAnca Dumitrache anouk Data 25 martie 2008 20:57:00
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <cstdio>
#include <algorithm>
#include <iostream>
#define DIM 1000005
using namespace std;

int N, K, A[DIM], S, F, V, P, M;

void Update(int nod, int st, int dr)
{
	if (st == dr)
	{
		A[nod] = V;
		return;
	}
	int pivot = (st + dr) / 2;
	if (P <= pivot) Update(2 * nod, st, pivot);
	else            Update(2 * nod + 1, pivot + 1, dr);
	A[nod] = max(A[2 * nod], A[2 * nod + 1]);
}

void Query(int nod, int st, int dr)
{
	if (S <= st && dr <= F)
	{
		M = max(M, A[nod]);
		return;
	}
	int pivot = (st + dr) / 2;
	if (S <= pivot) Query(2 * nod, st, pivot);
	if (F >  pivot) Query(2 * nod + 1, pivot + 1, dr);
}

int main()
{
	FILE *fin = fopen("arbint.in", "r");
	FILE *fout = fopen("arbint.out", "w");

	fscanf(fin, "%d%d", &N, &K);
	for (int i = 1; i <= N; i++)
	{
		fscanf(fin, "%d", &V);
		P = i;
		Update(1, 1, N);
	}
	int X;
	for (int i = 1; i <= K; i++)
	{
		fscanf(fin, "%d", &X);
		if (!X)
		{
			M = -1;
			fscanf(fin, "%d%d", &S, &F);
			//cout << S << " " << F << "\n";
			Query(1, 1, N);
			fprintf(fout, "%d\n", M);
		}
		else
		{
			fscanf(fin, "%d%d", &P, &V);
			Update(1, 1, N);
		}
	}

	fclose(fin);
	fclose(fout);
	return 0;
}