Cod sursa(job #582682)

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

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

using namespace std;

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

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

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", &val);
		//fprintf(fout, "%d ", val);
		update_tree(1, val, 1, N, i+1, 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)
			fprintf(fout, "%d\n", query_tree(1, 1, N, a, b));
		else
			update_tree(1, b, 1, N, a, a);
	}

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