Cod sursa(job #348539)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 15 septembrie 2009 23:55:18
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>

using namespace std;

#define fin  "arbint.in"
#define fout "arbint.out"

#define NMAX 100000

int N, M, arb[4 * NMAX];
int stTarget, drTarget;

void insert(int nod, int st, int dr, int val)
{
	if ( st == dr )
	{
		arb[ nod ] = val;
		return ;
	}

	int mid = st + (dr - st)/2;

	if ( stTarget <= mid )
		insert(2*nod,st,mid,val);
	else
		insert(2*nod + 1,mid + 1, dr, val);

	arb[nod] = max(arb[2*nod],arb[2*nod+1]);
}

int query(int nod, int st, int dr)
{
	if ( stTarget <= st && dr <= drTarget )
		return arb[nod];

	int mid = st + (dr-st)/2, ret = 0;

	if ( stTarget <= mid )
		ret = query(2*nod,st,mid);
	if ( drTarget > mid )
		ret = max(ret,query(2*nod+1,mid + 1,dr));

	return ret;
}

int main()
{
	int i, val, a, b, op;

	ifstream f1(fin);
	ofstream f2(fout);

	f1 >> N >> M;

	for ( i = 1; i <= N; ++i )
	{
		stTarget = i;
		f1 >> val, insert(1,1,N,val);
	}

	for ( i = 1; i <= M; ++i )
	{
		f1 >> op >> a >> b;
		if ( !op )
		{
			stTarget = a;
			drTarget = b;
			f2 << query(1,1,N) << endl;
		}
		else
		{
			stTarget = a;
			insert(1,1,N,b);
		}
	}

	return 0;
}