Cod sursa(job #409512)

Utilizator zalmanDanci Emanuel Sebastian zalman Data 3 martie 2010 18:25:37
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.1 kb
#include <iostream>
#include <cstdio>
#define Nmaxx 100010
using namespace std;

struct nod
{
	int val;
	nod *st, *dr, *sef;
	int s, e;
};

nod *niv1[Nmaxx], *v1[Nmaxx], *v2[Nmaxx], *(*surs)[Nmaxx] = &v1, *(*dest)[Nmaxx] = &v2, *tata;
int v[Nmaxx], N, M;
FILE *f=fopen("arbint.in", "r"),*g=fopen("arbint.out", "w"); 

void read(void)
{
	fscanf(f, "%d%d", &N, &M);
	for(int i = 1; i <= N; ++i)
		fscanf(f, "%d", &v[i]);
}
inline int maxx(int x, int y)
{
	if(x > y)
		return x;
	else
		return y;
}
void init(void)
{
	int num = N, k = 0;
	for(int i = 0; i < N; ++i)
	{
		nod *q = new nod;
		q -> val = v[i];
		q -> st = q -> dr = q->sef = NULL;
		q -> s = q -> e = i;
		niv1[++k] = v1[k] = q;
	}
	
	surs = &v1;
	dest = &v2;
	while(1)
	{	
		int poz = 0, imp = 0;
		if(num%2)
		{
			--num;
			imp =1;
		}
		for(int i = 1; i <= num; i += 2)
		{
			nod *q = new nod;
			q -> val = maxx((*surs)[i] -> val,(*surs)[i+1] -> val);
			q -> st = (*surs)[i];
			q -> dr = (*surs)[i+1];
			q -> sef = NULL;
			q -> s = (*surs)[i] -> s;
			q -> e = (*surs)[i+1] -> e;
			(*surs)[i] -> sef = q;
			(*surs)[i+1] -> sef = q;
			(*dest)[++poz] = q;
		}
		if(imp)
		{
			++num;
			nod *q = new nod;
			q -> val = (*surs)[num] -> val;
			q -> sef = NULL;
			q -> st = (*surs)[num], q->dr = NULL;
			q -> s = q->e = (*surs)[num] -> s;
			(*surs)[num] -> sef = q;
			(*dest)[++poz] = q;	
		}
		swap(surs, dest);
		num = num/2 + num%2;
		if(num/2 + num%2 == 1)
			break;
	}	
}
int query(nod *tata, int a, int b)
{
	int maxx = v[a];
	nod *nodCur = tata;
	while(1)
	{
		if(nodCur -> s >= a && nodCur-> e <= b)
		{
			if(nodCur -> val > maxx)
				maxx = nodCur -> val;
			break;
		}		
		if(nodCur -> dr -> s >= a && nodCur -> dr -> e <= b)
			if(nodCur -> dr -> val > maxx)
				maxx = nodCur -> dr -> val ;
		
		if(nodCur -> st -> s <= a && nodCur -> st -> e >= a)
			nodCur = nodCur -> st;
		else
			nodCur = nodCur -> dr;
	}
	while(1)
	{
		if(nodCur -> s >= a && nodCur-> e <= b)
		{
			if(nodCur -> val > maxx)
				maxx = nodCur -> val;
			break;
		}		
		if(nodCur -> st -> s >= a && nodCur -> st -> e <= b)
			if(nodCur -> st -> val > maxx)
				maxx = nodCur -> st -> val ;
		
		if(nodCur -> dr -> s <= a && nodCur -> dr -> e >= a)
			nodCur = nodCur -> dr;
		else
			nodCur = nodCur -> st;
	}
	
	return maxx;
}
void update(nod *tata, int a, int b)
{
	nod *nodCur = tata;
	while(1)
	{
		if(nodCur -> st == NULL)
			break;
		if(tata -> st -> s <= a && tata -> st -> e >= a)
			nodCur = nodCur -> st;
		else
			nodCur = nodCur -> dr;
	}
	nodCur -> val = b;
	while(1)
	{
		if(nodCur -> sef == NULL)
			break;
		nodCur = nodCur -> sef;
		if(nodCur -> dr != NULL)
			nodCur -> val = max(nodCur -> st -> val, nodCur -> dr -> val);
		else
			nodCur -> val = nodCur -> st -> val;
	}
}
void solve(void)
{
	init();
	tata = (*surs)[1];
	for(; M; --M)
	{
		int op, a, b;
		fscanf(f, "%d%d%d", &op, &a, &b);
		if(!op)
			fprintf(g, "%d\n", query(tata, a, b) );
		else
			update(tata, a, b);
	}
}
int main(void)
{
	read();
	solve();
	
	return 0;
}