Cod sursa(job #582692)

Utilizator varuvasiTofan Vasile varuvasi Data 15 aprilie 2011 18:36:03
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <stdio.h>
#include <string>
#include <string.h>

#define maxn 100033
int N, query_number, query_value, max_value;
int arb[4*maxn];
FILE *fin, *fout;

using namespace std;

void update_tree(int node, int st, int dr, int pos)
{
	if (st == dr)
		arb[node] = query_value;
	else
	{
		int mij = (st + dr) / 2;
		if (pos <= mij)
			update_tree(node * 2, st, mij, pos);
		if (pos > mij)
			update_tree(node * 2 + 1, mij + 1, dr, pos);
		arb[node] = (arb[node*2] > arb[node*2+1]) ? (arb[node*2]) : (arb[node*2+1]);
	}
}

void query_tree(int node, int st, int dr, int a, int b)
{
	if (a <= st && b >= dr)
		max_value = (arb[node] > max_value) ? arb[node] : max_value;
	else
	{
		int mij = (st + dr) / 2;
		if (a <= mij)
			query_tree(node*2, st, mij, a, b);
		if (b > mij)
			query_tree(node*2+1, mij+1, dr, a, b);
	}
}

int main()
{
	int i, val;
	fin = fopen("arbint.in", "rt");
	fout = fopen("arbint.out", "wt");
	fscanf(fin, "%d %d", &N, &query_number);

	for (i = 0; i < N; i++)
	{
		fscanf(fin, "%d", &query_value);
		//fprintf(fout, "%d ", val);
		update_tree(1, 1, N, i + 1);
		/*fprintf(fout, "--------------\n");
		for (j = 1; j <= 4*N; j++)
		{
			fprintf(fout, "%d %d\n", j, arb[j]);
		}*/
	}
	int op, a, b;
	for (i = 0; i < query_number; i++)
	{
		fscanf(fin, "%d %d %d", &op, &a, &b);
		//fprintf(fout, "%d %d %d\n", op, a, b);
		if (op == 0)
		{
			max_value = 0;
			query_tree(1, 1, N, a, b);
			fprintf(fout, "%d\n", max_value);
		}
		else
		{
			query_value = b;
			update_tree(1, 1, N, a);
		}
	}

	fclose(fin), fclose(fout);
	return 0;
}