Cod sursa(job #758090)

Utilizator igsifvevc avb igsi Data 14 iunie 2012 13:12:31
Problema Arbori de intervale Scor 50
Compilator c Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>

int A[500001];
int max;

void insert(int l, int r, int position, int value, int node)
{
	if(l == r)
	{
		A[node] = value;
	}
	else
	{
		int middle = (r - l)/ 2 + l;
		if(position <= middle) insert(l, middle, position, value, 2 * node);
		else insert(middle + 1, r, position, value, 2 * node + 1);
		
		A[node] = (A[2 * node] >= A[2 * node + 1] ? A[2 * node] : A[2 * node +1]);
	}
}

void getMax(int a, int b, int l, int r, int node)
{
	if(a <= l && r <= b)
	{
		if(A[node] > max)
			max = A[node];
	}
	else
	{
		int middle = (r - l) / 2 + l, max1 = 0, max2 = 0;
		if(a <= middle) getMax(a, b, l , middle, 2 * node);
		if(middle + 1 <= b) getMax(a, b, middle + 1, r, 2 * node + 1);
	}
}

int main()
{
	FILE *in = fopen("arbint.in", "r");
	FILE *out = fopen("arbint.out", "w");
	int n, m, op, a, b;
	
	fscanf(in, "%d %d", &n, &m);
	for(a = 1; a <= n; a++)
	{
		fscanf(in, "%d", &b);
		insert(1, n, a, b, 1); 
	}
	
	for(; m; m--)
	{
		fscanf(in, "%d %d %d", &op, &a, &b);
		if(op) insert(1, n, a, b, 1);
		else
		{
			max = 0;
			getMax(a, b, 1, n, 1); 
			fprintf(out, "%d\n", max);
		}
	}
	
	fclose(in);
	fclose(out);
	return 0;
}