Cod sursa(job #551478)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 10 martie 2011 20:17:24
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<fstream>
#include<iostream>
using namespace std;

const int NMAX=262144;
int ai[NMAX]={0};

inline int max(int a, int b)
{
	if(a>=b)
		return a;
	return b;
}

void update(const int& nod, const int& a, const int& b, const int& index, const int& value)
{
	if(a==b && b==index)
	{
		ai[nod]=value;
		return;
	}

	int mid=a+(b-a)/2;
	if(index<=mid)
		update(2*nod+1,a,mid,index,value);
	if(index>mid)
		update(2*nod+2,mid+1,b,index,value);
	ai[nod]=max(ai[2*nod+1],ai[2*nod+2]);
}


int query(const int& nod, const int& a, const int& b, const int& left, const int& right)
{
	int mx=0;

	if(left<=a && b<=right)
	{
		mx=max(ai[nod],mx);
		return mx;
	}
	int mid=a+(b-a)/2;
	if(left<=mid)
		mx=max(query(2*nod+1,a,mid,left,right),mx);
	if(right>mid)
		mx=max(query(2*nod+2,mid+1,b,left,right),mx);
	return mx;
}

int main()
{
	ifstream in("arbint.in");
	ofstream out("arbint.out");

	int n,m,nr,tip,a,b;
	in>>n>>m;

	//Build the interval tree
	for(int i=0;i<n;i++)
	{
		in>>nr;
		update(0,0,n-1,i,nr);
	}
	for(int i=0;i<m;i++)
	{
		in>>tip>>a>>b;
		if(tip==0)
		{
			--a,--b;
			out<<query(0,0,n-1,a,b)<<"\n";
		}
		else
		{
			--a;
			update(0,0,n-1,a,b);
		}
	}
	in.close();
	out.close();
}