Cod sursa(job #772518)

Utilizator SteveStefan Eniceicu Steve Data 30 iulie 2012 04:39:02
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>

using namespace std;

int N, M, lol, a, b, val;
int v[100005];
int aint[271073];
char pars[100];
ifstream fin ("arbint.in");

void Actualizare (int nod, int st, int dr)
{
	if (dr == st)
	{
		aint[nod] = b;
		return;
	}
	int mij = (st + dr) >> 1;
	if (a <= mij) Actualizare (nod << 1, st, mij);
	else Actualizare ((nod << 1) + 1, mij + 1, dr);
	aint[nod] = max (aint[nod << 1], aint[(nod << 1) + 1]);
}

int Interogare (int nod, int st, int dr)
{
	if (a <= st && b >= dr) return aint[nod];
	int mij = (st + dr) >> 1, S = 0;
	if (a <= mij) S = Interogare (nod << 1, st, mij);
	if (b > mij) S = max (S, Interogare ((nod << 1) + 1, mij + 1, dr));
	return S;
}

void Citire () {
	fin >> N >> M;
	for (int i = 1; i <= N; i++)
	{
		fin >> v[i];
		b = v[i];
		a = i;
		Actualizare (1, 1, N);
	}
	fin.getline (pars, 90);
}

void Business () {
	ofstream fout ("arbint.out");
	for (int i = 0; i < M; i++)
	{
		fin.getline (pars, 90);
		val = pars[0] - '0';
		a = 0;
		b = 0;
		for (lol = 2; pars[lol] >= '0' && pars[lol] <= '9'; lol++)
			a = a * 10 + pars[lol] - '0';
		lol++;
		for (; pars[lol] >= '0' && pars[lol] <= '9'; lol++)
			b = b * 10 + pars[lol] - '0';
		//fin >> val >> a >> b;
		if (val) Actualizare (1, 1, N);
		else fout << Interogare (1, 1, N) << "\n";
	}
	fin.close ();
	fout.close ();
}

int main () {
	Citire ();
	Business ();
	return 0;
}