Cod sursa(job #523615)

Utilizator cristiprgPrigoana Cristian cristiprg Data 18 ianuarie 2011 17:43:14
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>
#define DIM 500000

int n, m;
int arb[DIM];
int val, pos, maxim, A, B;

inline int max(const int &a, const int &b)
{
	return a<b?b:a;
}

void update(int nod, int st, int dr)
{
	if (st == dr)
	{
		arb[nod] = val;
		return;
	}
	
	int mij = (st+dr)/2;
	if (pos <= mij)
		update(2*nod, st, mij);
	else
		update(2*nod+1, mij+1, dr);
	
	arb[nod] = max( arb[2*nod], arb[2*nod+1]);
}

void query(int nod, int st, int dr)
{
	if (A <= st && dr <= B)
	{
		maxim = max(maxim, arb[nod]);
		return ;
	}
	
	int mij = (st+dr)/2;
	if (A <= mij)
		query(2*nod, st, mij);
	if (B>mij)
		query(2*nod+1, mij+1, dr);
	
}

int main()
{
	FILE *f = fopen("arbint.in", "r");
	fscanf(f, "%d%d", &n, &m);
	for (int i = 1, x; i <= n; ++i)
	{
		fscanf(f, "%d", &x);
		pos = i;
		val = x;
		update(1, 1, n);
	}
	
	FILE *cacat = fopen("arbint.out", "w");
	for (int type;m;--m)
	{
		fscanf(f, "%d%d%d", &type, &A, &B);
		if (type == 0)
		{
			maxim = -1;
			query(1, 1, n);
			fprintf(cacat, "%d\n", maxim);
		}
		else
		{
			pos = A;
			val = B;
			update(1, 1, n);
		}
	}
	
	return 0;
}