Cod sursa(job #1402121)

Utilizator andreiblaj17Andrei Blaj andreiblaj17 Data 26 martie 2015 12:40:22
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <cstdio>
#define nmax 100005

using namespace std;

FILE *fi, *fo;
int n, m;
int val, pos, a, b, maxim;
int ARB[4*nmax];

void update(int nod, int st, int dr)
{
	if (st == dr)
	{
		ARB[nod] = val;
		return;
	}
	int mid = (st + dr) >> 1;
	if (pos <= mid) update(2 * nod, st, mid);
	else		update(2 * nod + 1, mid + 1, dr);
	ARB[nod] = max(ARB[2*nod], ARB[2*nod+1]);
}

void query(int nod, int st, int dr)
{
	if (a <= st && dr <= b)
	{
		maxim = max(maxim, ARB[nod]);
		return;
	}
	int mid = (st + dr) >> 1;
	if (a <= mid) query(2 * nod, st, mid);
	if (b > mid) query(2 * nod + 1, mid + 1, dr);
}

int main() 
{
	
	fi = fopen("arbint.in", "r");
	fo = fopen("arbint.out", "w");

	fscanf(fi, "%d%d", &n, &m);

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

	for (int i = 1; i <= m; i++)
	{
		int tip, x, y;
		fscanf(fi, "%d%d%d", &tip, &x, &y);
		if (!tip)
		{
			maxim = -1;
			a = x, b = y;
			query(1, 1, n);
			fprintf(fo, "%d\n", maxim);
		}
		else
		{
			pos = x, val = y;
			update(1, 1, n);
		}
	}

	fclose(fi);
	fclose(fo);

	return 0;
}