Cod sursa(job #979135)

Utilizator petrutsxMihaela Petruta Gaman petrutsx Data 31 iulie 2013 20:53:25
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<stdio.h>
#define MAX(x, y) ((x > y) ? x : y)
#define NMAX 100001

int N, M, val, v, p;
int start, finish, index;
int Tree[4 * NMAX + 10];
int maximum;

void UPDATE(int node, int left, int right, int position, int value){
	if(left == right){
		Tree[node] = value;
		return;
	}
	int middle;
	middle = (left + right) / 2;
	if(position <= middle)
		UPDATE(2 * node, left, middle, position, value);
	else
		UPDATE(2 * node + 1, middle + 1, right, position, value);

	Tree[node] = MAX(Tree[2 * node], Tree[2 * node + 1]);
}

void QUERY(int node, int left, int right, int start, int finish){
	if(start <= left && finish >= right){
		if(Tree[node] > maximum)
			maximum = Tree[node];
		return;
	}

	int middle;
	middle = (left + right) / 2;
	if(start <= middle)
		QUERY(2 * node, left, middle, start, finish);
	if(finish > middle)
		QUERY(2 * node + 1, middle + 1, right, start, finish);
}


void read_print(FILE *pf, FILE *pg){
	int i;
	fscanf(pf, "%d %d", &N, &M);

	for(i = 1; i <= N; i++){
		fscanf(pf, "%d ", &val);
		UPDATE(1, 1, N, i, val);
	}

	for(i = 1; i <= M; i++){
		fscanf(pf, "%d %d %d", &index, &p, &v);
		switch(index){
			case 0: maximum = -1; QUERY(1, 1, N, p, v); fprintf(pg, "%d\n", maximum); break;
			case 1: UPDATE(1, 1, N, p, v); break;
		}
	}
}

int main(){
	FILE *pf, *pg;

	pf = fopen("arbint.in", "r");
	pg = fopen("arbint.out", "w");

	read_print(pf, pg);

	fclose(pf);
	fclose(pg);

	return 0;
}