Cod sursa(job #2972530)

Utilizator dumitrache12Dumitrache Iulian dumitrache12 Data 29 ianuarie 2023 17:38:50
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include<bits/stdc++.h>
using namespace std;

// ifstream in ("arbint.in");
// ofstream out("arbint.out");
auto& in = cin;
auto& out = cout;

int const N = 100005;
int n, m, v[N];
int depth, leaves_idx;

int next2exp()
{
	int pow=0;
	for(int x=n; x; x/=2)
		pow++;
	// out<<pow<<'\n';
	return pow;
}

void read()
{
	in>>n>>m;
	depth = next2exp();
	leaves_idx = pow(2, depth) - 1;
	// out<<leaves_idx<<endl;
	for(int i=0; i<n; i++)
		in>>v[leaves_idx+i];
}

void show()
{
	int end = pow(2, depth+1) - 1;
	for(int i=0; i<end; i++)
		out<<v[i]<<' ';
	out<<'\n';
}

int heapify(int p)
{
	if(p>=leaves_idx) return v[p];
	int left = heapify(2*p + 1);
	int right = heapify(2*p + 2);
	return v[p] = max(left, right);
}

int get(int p, int r, int s, int e)
{	
	
	if(s > e) {
		// out<<p<<" "<<r<<" "<<s<<" "<<e<<"=";out<<"0\n";
		return 0;
	}
	if(r == e - s + 1) {
		// out<<p<<" "<<r<<" "<<s<<" "<<e<<"=";out<<v[p]<<endl;
		return v[p];
	}
	int left = get(2*p + 1, r/2, s, min(e, r/2));
	int right = get(2*p + 2, r/2, max(1, s-r/2), e-r/2);
	// out<<p<<" "<<r<<" "<<s<<" "<<e<<"=";
	// out<<max(left, right)<<"\n";
	return max(left, right);
}

void put(int idx, int val)
{
	int p = leaves_idx+idx-1;
	v[p] = val;
	do
	{
		int u;
		if (p%2==0) p--;
		u = p / 2;
		int l = 2 * u + 1;
		int r = 2 * u + 2;
		v[u] = max(v[l], v[r]);
		p = u;
	}while(p);
}

int main(){
	read();
	heapify(0);
	// show();
	for(int i=0; i<m; i++)
	{
		int o, a, b;
		in>>o>>a>>b;
		if(o == 0)
			out<<get(0, 8, a, b)<<endl;
		else
			put(a, b);
	}
	return 0;
}