Cod sursa(job #1459386)

Utilizator ArkinyStoica Alex Arkiny Data 9 iulie 2015 19:00:30
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 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];

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

	construct(l,(l+r)/2,k*2);
	construct((l+r)/2 +1,r,k*2+1);

	t[k].v=(t[k*2].v>t[k*2+1].v) ? t[k*2].v:t[k*2+1].v;
}

void actualizare(int l,int r,int e,int k)
{
	if(l==r)
	{
		t[k].v=v[e];
		return;
	}
	else
	{
		int mij=(l+r)/2;
		if(e<=mij)
			actualizare(l,mij,e,2*k);
		else
			actualizare(mij+1,r,e,2*k+1);
		t[k].v=(t[k*2].v>t[k*2+1].v) ? t[k*2].v:t[k*2+1].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';
			cout<<endl;
		}
		else
		{
		   v[a]=b;
			actualizare(1,N,a,1);
		}
	}
	
	return 0;
}