Cod sursa(job #365370)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 18 noiembrie 2009 15:57:46
Problema Arbori de intervale Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.33 kb
#include<stdio.h>
#define infile "arbint.in"
#define outfile "arbint.out"
#define nmax (2*(100*1000+1))
int x[nmax]; //valoarea maxima din acest subarbore
char y[nmax]; //daca intervalul ce este retinut de aceasta radacina a fost modificat in totalitate
int n; //numarul de elemente ale sirului
int m; //numarul de operatii

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

void update(int nod, int st, int dr, int a, int b, int val)
{
	if(y[nod/2]) { x[nod]=x[nod/2]; y[nod]=1; } //daca tatal nodului a fost modificat complet
	if(a<=st && dr<=b) { x[nod]=val; y[nod]=1; return; } //modificam intervalul
	int mij=(st+dr)/2; //mijlocul intervalului
	if(a<=mij) update(2*nod,st,mij,a,b,val); //modificam partea stanga
	if(mij<b) update(2*nod+1,mij+1,dr,a,b,val); //modificam partea dreapta
	x[nod]=max(x[2*nod],x[2*nod+1]); //actualizam valoarea maxima
	y[nod]=0; //marcam ca acest nod nu a fost modificat in totalitate
}

int main()
{
	int i,j,a,b;
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	scanf("%d %d\n",&n,&m);
	
	//citim cele n elemente ale sirului initial
	for(i=1;i<=n;i++)
	{
		scanf("%d",&j);
		update(1,1,n,i,i,j); //salvam in arbore
	}
	
	//citim cele m operatii
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d\n",&j,&a,&b);
		if(j) update(1,1,n,a,a,b); //daca avem de ffacut un update
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}