Cod sursa(job #590107)

Utilizator t2010tZaharia Teofil t2010t Data 15 mai 2011 16:09:31
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <fstream>
#define maxm(a, b) ((a > b) ? a : b)
using namespace std;

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

struct s_node
{
int l,r;
int a,b;
int mij;
int max;
};

int n,m,nnode,maxk;
int t,x,y;
int a[100001];
s_node node[200001];


void new_node(int left, int right, int k);
void max(int k);
void interog(int left, int right, int k);
void update(int k);

int main()
{

int i1;

in>>n>>m;
for(i1=1;i1<n+1;i1++)
	in>>a[i1];

//creerea arborelui
new_node(1,n,nnode+1);
//

//max 2n-1 noduri
for(i1=1;i1<nnode+1;i1++)
	if(node[i1].a == node[i1].b)
		node[i1].max = a[node[i1].a];
	else
		node[i1].max = -1;
max(1);
//

//cerinte
for(i1=0;i1<m;i1++)
	{
	in>>t>>x>>y;
	if(!t) //interogare t == 0
		{
		maxk = -1;
		interog(x,y,1);
		out<<maxk<<'\n';
		}
	else // t == 1
		{
		update(1);
		}
	}
//

in.close();
out.close();
return 0;
}

void new_node(int left, int right, int k)
{
node[++nnode].a = left; node[nnode].b = right; node[nnode].mij = (left+right)/2;

if(left != right)
	{
	node[k].l = nnode + 1;
	new_node(left, node[k].mij, nnode+1);
	node[k].r = nnode + 1;
	new_node(node[k].mij+1, right, nnode+1);
	}

}

void max(int k)
{
if(node[node[k].l].max == -1)
	max(node[k].l);
if(node[node[k].r].max == -1)
	max(node[k].r);
node[k].max = maxm(node[node[k].l].max, node[node[k].r].max);
}

void interog(int left, int right, int k)
{
if(left == node[k].a && right == node[k].b)
	maxk = maxm(maxk, node[k].max);
else
	{
	if(right <= node[k].mij) 
		interog(left,right,node[k].l);
	else if(left > node[k].mij)
		interog(left,right,node[k].r);
	else 			 
		{
		interog(left,node[k].mij,node[k].l); 
		interog(node[k].mij+1,right,node[k].r);
		}
	}
}

void update(int k)
{
if(node[k].l == node[k].r)
	node[k].max = y;
else
	{
	if(x <= node[k].mij)
		update(node[k].l);
	else
		update(node[k].r);
	node[k].max = maxm(node[node[k].l].max, node[node[k].r].max);
	}
}