Cod sursa(job #1166449)

Utilizator ChallengeMurtaza Alexandru Challenge Data 3 aprilie 2014 16:34:42
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>

using namespace std;

const char InFile[] = "arbint.in";
const char OutFile[] = "arbint.out";
const int MaxN = 100111;
const int AINT_SIZE = MaxN*4;

ifstream fin(InFile);
ofstream fout(OutFile);

int N, M, op, query_ans, query_left, query_right, update_pos, update_val, V[MaxN], AINT[AINT_SIZE];

void Init(int nod, int st, int dr)
{
	if (st == dr)
	{
		AINT[nod] = V[st];
		return;
	}

	int mid = (st + dr) >> 1;
	int left = nod << 1;
	int right = left + 1;
	
	Init(left, st, mid);
	Init(right, mid + 1, dr);

	if (AINT[left] > AINT[right])
	{
		AINT[nod] = AINT[left];
	}
	else
	{
		AINT[nod] = AINT[right];
	}
}

void Update(int nod, int st, int dr)
{
	if (st == dr)
	{
		AINT[nod] = update_val;
		return;
	}

	int mid = (st + dr) >> 1;
	int left = nod << 1;
	int right = left + 1;

	if (update_pos <= mid)
	{
		Update(left,st,mid);
	}
	else
	{
		Update(right,mid+1,dr);
	}

	if (AINT[left] > AINT[right])
	{
		AINT[nod] = AINT[left];
	}
	else
	{
		AINT[nod] = AINT[right];
	}
}

void Query(int nod, int st, int dr)
{
	if (query_left <= st && dr <= query_right)
	{
		if (query_ans < AINT[nod])
		{
			query_ans = AINT[nod];
		}
		return;
	}

	int mid = (st + dr) >> 1;
	int left = nod << 1;
	int right = left+1;

	if (query_left <= mid)
	{
		Query(left,st,mid);
	}
	if (mid < query_right)
	{
		Query(right,mid+1,dr);
	}
}

int main()
{
	fin >> N >> M;
	for (register int i = 1; i <= N; ++i)
	{
		fin >> V[i];
	}

	Init(1,1,N);

	for (register int i = 1; i <= M; ++i)
	{
		fin >> op;
		if (op == 0)
		{
			fin >> query_left >> query_right;
			query_ans = 0;
			Query(1,1,N);
			fout << query_ans << "\n";
		}
		if (op == 1)
		{
			fin >> update_pos >> update_val;
			Update(1,1,N);
		}
	}

	fin.close();
	fout.close();
	return 0;
}