Cod sursa(job #917455)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 17 martie 2013 21:44:13
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>

#define NMAX 100100

using namespace std;

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

int N, M, start, finish, value, position;
int v[NMAX], aint[NMAX << 2];

inline int query(int nod, int st, int dr)
{
	if (start <= st && dr <= finish)
		return aint[nod];
	int mid = (st + dr) >> 1, ret = 0;
	if (start <= mid) ret = max(ret, query(nod << 1, st, mid));
	if (mid < finish) ret = max(ret, query((nod << 1) + 1, mid + 1, dr));
	return ret;
}

inline void update(int nod, int st, int dr)
{
	if (st == dr)
	{
		aint[nod] = value; return ;
	}
	int mid = (st + dr) >> 1;
	if (position <= mid) update(nod << 1, st, mid);
	else
	if (mid < position) update((nod << 1) + 1, mid + 1, dr);
	aint[nod] = max(aint[nod << 1], aint[(nod << 1) + 1]);
}

int main()
{
	fin >> N >> M;
	for (int i = 1; i <= N; i++)
		fin >> v[i], position = i, value = v[i], update(1, 1, N);
	
	for (; M--; )
	{
		int t, a, b;
		fin >> t >> a >> b;
		if (t == 0)
		{
			start = a; finish = b;
			fout << query(1, 1, N) << '\n';
		}
		else
		{
			position = a; value = b;
			update(1, 1, N);
		}
	}
}