Cod sursa(job #1451968)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 19 iunie 2015 12:17:17
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.72 kb
#include <stdio.h>
#include <stdlib.h>
#define MAX 100005

typedef struct{
	int s, d, info;
} TArb;

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

void constr(TArb* a, int* v, int s, int d, int i);
int query(TArb* arb, int a, int b, int i);
void update(TArb* arb, int a, int b, int i);

int main(){
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	int n, m, v[MAX], i, k = 1, nr, x, a, b;
	TArb *arb;
	scanf("%d%d", &n, &m);
	for(i = 1; i <= n; i++)
		scanf("%d", &v[i]);
	
	nr = 2 * n - 1;
	while(nr > 0){
		nr /= 2;
		k *= 2;
	}
	arb = (TArb*)calloc(k + 1, sizeof(TArb));
	if(!arb) return 0;
	constr(arb, v, 1, n, 1);
	
	for(i = 0; i < m; i++){
		scanf("%d%d%d", &x, &a, &b);
		if(x == 0)
			printf("%d\n", query(arb, a, b, 1));

		else
			update(arb, a, b, 1);
	}
	
	free(arb);
	return 0;
}

void constr(TArb* a, int* v, int s, int d, int i){
	if(s == d){
		a[i].info = v[s];
		a[i].s = a[i].d = s;
		return;
	}

	a[i].s = s;
	a[i].d = d;
	int mij = (s + d) / 2;
	constr(a, v, s, mij, 2 * i);
	constr(a, v, mij + 1, d, 2 * i + 1);
	a[i].info = max(a[2 * i].info, a[2 * i + 1].info);
}

int query(TArb* arb, int a, int b, int i){
	if(a <= arb[i].s && arb[i].d <= b)
		return arb[i].info;

	int mij = (arb[i].s + arb[i].d) / 2, x = 0, y = 0;

	if(a <= mij)
		x = query(arb, a, b, 2 * i);
	if(b > mij)
		y = query(arb, a, b, 2 * i + 1);

	return max(x, y);
}

void update(TArb* arb, int a , int b, int i){
	if(arb[i].s == arb[i].d && arb[i].s == a){
		arb[i].info = b;
		return;
	}

	int mij = (arb[i].s + arb[i].d) / 2;
	if(a <= mij){
		update(arb, a, b, 2 * i);
		arb[i].info = max(arb[2 * i].info, arb[2 * i + 1].info);
	}

	else{
		update(arb, a, b, 2 * i + 1);
		arb[i].info = max(arb[2 * i].info, arb[2 * i + 1].info);
	}
}