Cod sursa(job #365399)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 18 noiembrie 2009 16:31:24
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.82 kb
#include<stdio.h>
#define infile "arbint.in"
#define outfile "arbint.out"
#define nmax 300000
int x[nmax]; //valoarea maxima din acest subarbore
int n; //numarul de elemente ale sirului
int m; //numarul de operatii
int a,b; //intervalul pe care se cauta
int poz; //pozitia care se va modifica
int val; //valoarea cu care se modifica

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

void update(int nod, int st, int dr)
{
	if(st==dr) { x[nod]=val; return; } //modificam valoarea pozitiei
	int mij=(st+dr)/2; //mijlocul intervalului
	if(poz<=mij && 2*nod<nmax) update(2*nod,st,mij); //modificam partea stanga
	if(mij<poz && 2*nod+1<nmax) update(2*nod+1,mij+1,dr); //modificam partea dreapta
	if(2*nod<nmax) x[nod]=x[2*nod]; //valoarea maxima din partea stanga
	if(2*nod+1<nmax) x[nod]=max(x[nod],x[2*nod+1]); //valoarea maxima din partea dreapta
}

int query(int nod, int st, int dr)
{
	if(a<=st && dr<=b) return x[nod]; //daca intervalul este complet, am gasit valoarea
	int mij=(st+dr)/2; //mijlocul intervalului
	int val=0; //valoarea maxima din acest arbore
	if(a<=mij && 2*nod<nmax) val=query(2*nod,st,mij); //valoarea maxima din arborele stang
	if(mij<b && 2*nod+1<nmax) val=max(val,query(2*nod+1,mij+1,dr)); //vedem daca in intervalul drept avem o valoare mai mare
	return val; //returnam valoarea
}

int main()
{
	int i;
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	scanf("%d %d\n",&n,&m);
	
	//citim cele n elemente ale sirului initial
	for(poz=1;poz<=n;poz++)
	{
		scanf("%d",&val);
		update(1,1,n); //salvam in arbore
	}
	
	//cele m operatii
	while(m--)
	{
		scanf("%d",&i); //citim tipul operatiei
		if(i)
		{ //daca avem update
			scanf("%d %d\n",&poz,&val);
			update(1,1,n);
		}
		else
		{ //daaca avem query
			scanf("%d %d\n",&a,&b);
			printf("%d\n",query(1,1,n));
		}
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}