Cod sursa(job #829114)

Utilizator costel93FMI - Dumea Eduard Constantin costel93 Data 4 decembrie 2012 21:13:33
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int n, m, v[262145], maxim;

int max(int a, int b)
{
	if(a>b)
		return a;
	return b;
}

void adaugare(int k, int st, int dr, int poz, int val)
{
	if (st == dr)
	{
		v[k] = val;
		return;
	}
	
	int m = (st+dr)/2, fs = k*2;
	
	if (poz <= m) 
		adaugare(fs, st, m, poz, val);
	else 
		adaugare(fs+1, m+1, dr, poz, val);
	
	v[k] = max(v[fs], v[fs+1]);
}

void cautare(int k, int st, int dr, int inc, int sf)
{
	if (inc <= st && dr <= sf)
	{
		if (maxim < v[k]) 
			maxim = v[k];
		return;
	}
	
	int m = (st+dr)/2, fs = k*2;
	if (inc <= m) 
		cautare(fs, st, m, inc, sf);
	if (m < sf) 
		cautare(fs+1, m+1, dr, inc, sf);
}

int main()
{
	int a, b, c, i;
	
	f>>n>>m;
	
	for (i=1;i<=n;++i)
	{
		f>>c;
		adaugare(1, 1, n, i, c);
	}
	
	for (i=1;i<=m;++i)
	{
		f>>c>>a>>b;
		if (c)
			adaugare(1, 1, n, a, b);
		else
		{
			maxim = 0;
			cautare(1, 1, n, a, b);
			g<<maxim<<"\n";
		}
	}
	return 0;
}