Cod sursa(job #2923115)

Utilizator MarcGrecMarc Grec MarcGrec Data 11 septembrie 2022 17:07:53
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#define MAX_N 100000

#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

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

struct IntervalTree
{
	void set(int node, int left, int right, int index, int value)
	{
		if ((left == right) && (left == index))
			data[node] = value;
		else
		{
			int middle = (left + right) / 2;
			if (index <= middle)
				set(node << 1, left, middle, index, value);
			else
				set(node << 1 | 1, middle + 1, right, index, value);
			data[node] = max(data[node << 1], data[node << 1 | 1]);
		}
	}
	
	void get(int node, int left, int right, int qleft, int qright, int& out)
	{
		if ((qleft <= left) && (right <= qright))
			out = max(out, data[node]);
		else
		{
			int middle = (left + right) / 2;
			if (qleft <= middle)
				get(node << 1, left, middle, qleft, qright, out);
			if (qright > middle)
				get(node << 1 | 1, middle + 1, right, qleft, qright, out);
		}
	}
	
	int data[4 * MAX_N];
} it;

int n, m;

int main()
{
	fin >> n >> m;
	for (int i = 1; i <= n; ++i)
	{
		int x;
		fin >> x;
		it.set(1, 1, n, i, x);
	}
	for (int i = 1; i <= m; ++i)
	{
		int t, x, y, z = 0;
		fin >> t >> x >> y;
		if (t == 0)
		{
			it.get(1, 1, n, x, y, z);
			fout << z << '\n';
		}
		else
			it.set(1, 1, n, x, y);
	}
    fin.close();
    fout.close();
    return 0;
}