Cod sursa(job #2226366)

Utilizator TrixerAdrian Dinu Trixer Data 30 iulie 2018 05:22:06
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <stdio.h>

#define max(a, b) (((a) > (b)) ? (a) : (b))

#define MAXN 100000

int int_tree[4 * MAXN + 2];

void update(int node, int left, int right, int a, int b, int v)
{
	if (a <= left && right <= b)
		int_tree[node] = v;
	else {
		int mid = (left + right) / 2;
		if (a <= mid)
			update(node * 2, left, mid, a, b, v);
		if (b > mid)
			update(node * 2 + 1, mid + 1, right, a, b, v);
		int_tree[node] = max(int_tree[node * 2], int_tree[node * 2 + 1]);
	}
}

int query(int node, int left, int right, int a, int b)
{
	int x = -1;
	int y = -1;

	if (a <= left && right <= b)
		return int_tree[node];
	else {
		int mid = (left + right) / 2;
		if (a <= mid)
			x = query(node * 2, left, mid, a, b);
		if (b > mid)
			y = query(node * 2 + 1, mid + 1, right, a, b);
		return max(x, y);
	}
}

void print_array(int *v, int a, int b)
{
	printf("[");
	for (int i = a; i < b; i++)
		printf("%d, ", v[i]);
	printf("%d]\n", v[b]);
}

int main(void)
{
	// read input
	int n, m, x, a, b, q;

	freopen("arbint.in", "r", stdin);
	scanf("%d%d", &n, &m);

	for (int i = 1; i <= n; i++) {
		scanf("%d", &x);
		update(1, 1, n, i, i, x);
	}

	// write output
	freopen("arbint.out", "w", stdout);
	for (int i = 0; i < m; i++) {
		scanf("%d%d%d", &x, &a, &b);
		
		if (x == 0) {
			q = query(1, 1, n, a, b);
			printf("%d\n", q);
		} else
			update(1, 1, n, a, a, b);
	}

	return 0;
}