Cod sursa(job #1459399)

Utilizator ArkinyStoica Alex Arkiny Data 9 iulie 2015 19:11:14
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include<iostream>
#include<fstream>
using namespace std;

#define MAX 100001

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

struct Interval
{
	int l,r,v;
}t[4*MAX +100];

int v[MAX];

int construct(int l,int r,int k)
{
	t[k].l=l;
	t[k].r=r;
	if(l==r)
	{
		t[k].v=v[l];
		return v[l];
	}

	int el1,el2;
	el1=construct(l,(l+r)/2,k*2);
	el2=construct((l+r)/2 +1,r,k*2+1);

	t[k].v=(el1>el2) ? el1:el2;

	return t[k].v;
}

int actualizare(int l,int r,int e,int k)
{
	if(l==r)
	{
		t[k].v=v[e];
		return v[e];
	}
	else
	{
		int mij=(l+r)/2;
		int el1,el2;
		if(e<=mij)
		{
			el1=actualizare(l,mij,e,2*k);
			el2=t[2*k + 1].v;
		}
		else
		{
			el1=actualizare(mij+1,r,e,2*k+1);
			el2=t[2*k].v;
		}
		t[k].v=(el1>el2) ? el1:el2;
		return t[k].v;
	}
}
int interogare(int l,int r,int a,int b,int k)
{
	if(a<=l && r <=b)
	{
		return t[k].v;
	}
	else
	{
		int mij=(l+r)/2;
		int el1=-1,el2=-1;
		if(a<=mij)
			el1=interogare(l,mij,a,b,k*2);
		if(b>mij)
			el2=interogare(mij+1,r,a,b,k*2+1);
		return (el1>el2) ? el1:el2;
	}
}
int main()
{
	int N,M;
	in>>N>>M;

	for(int i=1;i<=N;i++)
		in>>v[i];
	int op,a,b;
	construct(1,N,1);
	
	for(int i=1;i<=M;i++)
	{
		in>>op>>a>>b;
		if(op==0)
		{
			out<<interogare(1,N,a,b,1)<<'\n';
		}
		else
		{
		   v[a]=b;
			actualizare(1,N,a,1);
		}
	}
	
	return 0;
}