Cod sursa(job #1497374)

Utilizator ArkinyStoica Alex Arkiny Data 6 octombrie 2015 18:44:03
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<fstream>
#include<iostream>
#include<string.h>
using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

int A[2000000],N,M;

void update(int i, int j,int p, int v,int k)
{
	if (i != j)
	{
		if (p > (i + j) / 2)
			update((i + j) / 2 + 1, j, p,v, 2 * k + 1);
		else
			update(i, (i + j) / 2, p, v, 2 * k);

		if (A[2 * k + 1] > A[2 * k])
			A[k] = A[2 * k + 1];
		else
			A[k] = A[2 * k];
	}
	else
		A[k] = v;
}

int query(int i,int j,int i1,int j1,int k)
{
	if (i == i1 && j == j1)
		return A[k];

	int mij = (i + j) / 2;
	if (i1 <= mij && j1 > mij)
	{
		int a, b;
		a=query(i, mij, i1, mij, 2 * k);
		b=query(mij + 1, j, mij + 1, j1, 2 * k + 1);
		return a>b ? a : b;
	}
	else if (j1 <= mij)
	{
		return query(i, mij, i1, j1, 2*k);
	}
	else
	{
		return query(mij + 1, j, i1, j1, 2 * k + 1);
	}
}

int main()
{
	in >> N >> M;
	int q,a,b;
	for (int i = 1;i <= N;++i)
	{
		in >> q;
		update(1, N, i, q, 1);
	}
	for (int i = 1;i <= M;++i)
	{
		in >> q>>a>>b;
		if (q == 0)
			out << query(1,N,a,b,1)<<'\n';
		else
			update(1, N, a, b, 1);
	}
	return 0;
}