Cod sursa(job #1437541)

Utilizator alexandru.huleaAlexandru Hulea alexandru.hulea Data 17 mai 2015 21:44:33
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.25 kb
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define NR 100000

using namespace std;

int query(int *vec, int begin, int end, int a, int b, int poz) {
	// begin == 0, end == n - 1
//	printf("q begin = %i, end = %i, poz = %i, a = %i, b = %i\n", begin, end, poz, a, b);
	if (begin == a && end == b) {
		return vec[poz];
	}
	int mid = (begin + end) / 2;
	if (a > mid) {
		return query(vec, mid + 1, end, a, b, poz * 2 + 1);
	}
	else if (b <= mid) {
		return query(vec, begin, mid, a, b, poz * 2);
	}
	else {
		int res1 = query(vec, begin, mid, a, mid, poz * 2);
		int res2 = query(vec, mid + 1, end, mid + 1, b, poz * 2 + 1);
		return res1 > res2 ? res1 : res2;
	}
}

void update(int *vec, int begin, int end, int a, int b, int poz) {
	
//	printf("u begin = %i, end = %i, poz = %i, a = %i, b = %i\n", begin, end, poz, a, b);
	if (begin == end) {
		vec[poz] = b;
		return;
	}
	int mid = (begin + end) / 2;
	if (a <= mid) {
		update(vec, begin, mid, a, b, poz * 2);
		vec[poz] = vec[2 * poz] > vec[2 * poz + 1] ? vec[2 * poz] : vec[2 * poz + 1];
	}
	else {
		update(vec, mid + 1, end, a, b, poz * 2 + 1);
		vec[poz] = vec[2 * poz] > vec[2 * poz + 1] ? vec[2 * poz] : vec[2 * poz + 1];
	}
}

int main() {

	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);

	int n, m;
	scanf("%i", &n);
	scanf("%i", &m);

	int *vec = (int*)calloc(NR * 4, sizeof(int));
	for (int i = 1; i < n + 1; i++) {
		int begin = 1;
		int end = n;
		int poz = 1;
		int x;
		scanf("%i", &x);
		vec[poz] = vec[poz] > x ? vec[poz] : x;
		while (begin != end) {
			int mid = (begin + end) / 2;
			if (i <= mid) {
				poz = 2 * poz;
				vec[poz] = vec[poz] > x ? vec[poz] : x;
				end = mid;
			}
			else {
				poz = 2 * poz + 1;
				vec[poz] = vec[poz] > x ? vec[poz] : x;
				begin = mid + 1;
			}
		}
		vec[poz] = x;
	}

	for (int i = 0; i < m; i++) {
		int tip, a, b;
		scanf("%i", &tip);
		scanf("%i", &a);
		scanf("%i", &b);

	/*	for (int i = 0; i < 4 * n; i++) {
			printf("%i ", vec[i]);
		}
		printf("\n");*/
		if (tip == 0) {
			printf("%i\n", query(vec, 1, n, a, b, 1));
		}
		else {
			update(vec, 1, n, a, b, 1);
		}
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}