Cod sursa(job #828135)

Utilizator vladm97Matei Vlad vladm97 Data 3 decembrie 2012 08:42:45
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<fstream>
#define lmax 300000
using namespace std;
int arbin[lmax];
int start,finish,val,poz,maxim;
int max(int a,int b){
	if(a>b)return a;
	return b;}
void actualizare(int nod, int st, int dr){
	if(st==dr)
		arbin[nod]=val;
	else{
		int div=(st+dr)/2;
		if(poz<=div)actualizare(2*nod,st,div);
		else actualizare(2*nod+1,div+1,dr);
		arbin[nod]=max(arbin[2*nod],arbin[2*nod+1]);//astfel se obtine maximul din fiecare interval
	}
}
void interogare(int nod, int st, int dr){
	if(start<=st && dr<=finish)
		{if(maxim<=arbin[nod])maxim=arbin[nod];}
	else{
		int div=(st+dr)/2;
		if(start<=div)interogare(2*nod,st,div);
		if(div<finish)interogare(2*nod+1,div+1,dr);
	}
}
int main(){
	int a,b,x,i,n,m;
	ifstream f("arbint.in");
	ofstream g("arbint.out");
	f>>n>>m;
	for(i=1;i<=n;i++){
		f>>x;
		poz=i;
		val=x;
		actualizare(1,1,n);
	}
	for(i=1;i<=m;i++){
		f>>x>>a>>b;
		if(x==0){
				maxim=-1;
				start=a;
				finish=b;
				interogare(1,1,n);
				g<<maxim<<'\n';
			}
			else{poz=a;
			val=b;
			actualizare(1,1,n);
			}
		}
	}