Cod sursa(job #1653848)

Utilizator netedu_andreiFII Andrei Netedu netedu_andrei Data 16 martie 2016 17:26:01
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
// arbint.cpp : Defines the entry point for the console application.
//

//#include "stdafx.h"
#include <fstream>

using namespace std;

class arbint
{
private:
	int a[200000];
	int nre;
public:
	arbint(int n)
	{
		nre = n;
		memset(a, 0, 200000);
	}
	void update(int node, int st, int dr, int i, int nr)
	{
		if (st == dr)
		{
			a[node] = nr;
		}
		else
		{
			int mij = (st + dr) / 2;
			if (i <= mij)
			{
				update(node * 2, st, mij, i, nr);
			}
			else
			{
				update(node * 2 + 1, mij + 1, dr, i, nr);
			}
			if (a[node * 2] > a[node * 2 + 1]) a[node] = a[node * 2];
			else a[node] = a[node * 2 + 1];
		}
	}
	int maxint(int node, int st, int dr, int x, int y)
	{
		if (x <= st && dr <= y)
			return a[node];
		int mij = (st + dr) / 2; 
		int maxs = 0, maxd = 0;
		if (x <= mij)
			maxs = maxint(node*2, st, mij, x, y);
		if (mij < y)
			maxd = maxint(node * 2 + 1, mij + 1, dr, x, y);
		if (maxs > maxd) return maxs;
		return maxd;
	}
};

int main()
{
	ifstream fin("arbint.in");
	ofstream fout("arbint.out");
	int n, m, nr, i;
	fin >> n >> m;
	arbint t(n);
	for (i = 1; i <= n; i++)
	{
		fin >> nr;
		t.update(1, 1, n, i, nr);
	}
	for (i = 1; i <= m; i++)
	{
		int op, x, y;
		fin >> op >> x >> y;
		if (op == 0)
		{
			fout << t.maxint(1, 1, n, x, y) << '\n';
		}
		else
		{
			t.update(1, 1, n, x, y);
		}
	}
	return 0;
}