Cod sursa(job #1459395)

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

#define MAX 100001

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

int t[4*MAX +100];

int v[MAX];

void actualizare(int l,int r,int e,int k)
{
	if(l==r)
	{
		t[k]=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]=(t[k*2]>t[k*2+1]) ? t[k*2]:t[k*2+1];
	}
}
int interogare(int l,int r,int a,int b,int k)
{
	if(a<=l && r <=b)
	{
		return t[k];
	}
	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];
		actualizare(1,N,i,1);
	}
	int op,a,b;
	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;
}