Cod sursa(job #1052334)

Utilizator deea101Andreea deea101 Data 11 decembrie 2013 02:32:44
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
#include <iostream>
#define nmax 100001
using namespace std;
ifstream f("arbint.in");

int arb[5*nmax],n,rez;

int maxim(int a,int b)
{
	if(a>b) return a;
	else return b;
}

void change(int p, int v, int s, int d, int c) //pozitie dorita, valoare noua, stanga, dreapta, numar nod curent
{
	if(s==d) { arb[c]=v; return; }
	if(p<s || d<p) return;
	
	int m=(s+d)/2;
	if(p<=m) change(p,v,s,m,2*c);
	else change(p,v,m+1,d,2*c+1);
	
	arb[c]=maxim(arb[2*c],arb[2*c+1]);
}

void query(int a,int b, int s, int d, int c) //[a,b] intervalul dorit, [s,d] intervalul curent c
{
	
	if( a<=s && d<=b ) 
	{
		if(arb[c]>rez) rez=arb[c];
		return;
	}
	
	int m=(s+d)/2;
	if(a<=m) query(a,b,s,m,2*c);
	if(b>m) query(a,b,m+1,d,2*c+1);
}


int main()
{
	freopen("arbint.out","w",stdout);
	int m,i,x,a,b;
	f>>n>>m;
	for(i=1;i<=n;i++)
	{
		f>>x;
		change(i,x,1,n,1);
	}
	for(i=1;i<=m;i++)
	{
		f>>x; f>>a>>b;
		if(!x)
		{
			rez=-1;
			query(a,b,1,n,1);
			printf("%d\n",rez);
		}
		else change(a,b,1,n,1);
	}

}