Cod sursa(job #2739356)

Utilizator Alin_StanciuStanciu Alin Alin_Stanciu Data 7 aprilie 2021 20:37:37
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#define MAX_N 100000
#define LOG_MAX_N 17

#include <iostream>
#include <fstream>

using namespace std;

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

int n, m, A[MAX_N + 1];
int T[LOG_MAX_N + 1][MAX_N + 1]; // T[e][ind]

void Set(int ind, int val)
{
	T[0][ind] = val;
	
	for (int e = 1; e <= LOG_MAX_N; ++e)
	{
		ind /= 2;
		T[e][ind] = max(T[e - 1][ind * 2], T[e - 1][ind * 2 + 1]);
	}
}

int Get(int st, int dr)
{
	int ma = 0, e = 0, ind = st;
	
	while (true)
	{
		int l = ind * (1 << e), r = l + (1 << e) - 1;
		
		while (r > dr) // Daca depasesc dreapta ma mai micsorez.
		{
			ind *= 2;
			--e;
			l = ind * (1 << e), r = l + (1 << e) - 1;
		}
		
		while (ind % 2 == 0 && r + (1 << e) <= dr) // Ca sa pot mari trebuie sa fiu pe fiul din stanga (ind par) si sa imi incapa tot tatal in interval.
		{
			ind /= 2;
			++e;
			l = ind * (1 << e), r = l + (1 << e) - 1;
		}
		
		ma = max(ma, T[e][ind]);
		
		if (r == dr)
			return ma;
		
		++ind;
	}
}

int main()
{
    fin >> n >> m;
    
    for (int i = 1; i <= n; ++i)
    {
		int x;
		fin >> x;
		Set(i, x);
	}
	
	for (int i = 1; i <= m; ++i)
	{
		int c, a, b;
		fin >> c >> a >> b;
		
		if (c == 0)
			fout <<  Get(a, b) << '\n';
		else
			Set(a, b);
	}
    
    return 0;
}