Cod sursa(job #2972552)

Utilizator dumitrache12Dumitrache Iulian dumitrache12 Data 29 ianuarie 2023 18:20:41
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 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 = 200099;
int n, m, v[N];
int depth, padded, fin;

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

void read()
{
	in>>n>>m;
	depth = next2exp();
	padded = pow(2, depth);
	for(int i=0; i<n; i++)
		in>>v[padded+i];
}

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

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

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

void put(int idx, int val)
{
	int p = padded+idx-1;
	v[p] = val;
	for(int u=p/2; u; u/=2)
		v[u] = max(v[2*u], v[2*u+1]);
}

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