Cod sursa(job #2641433)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 11 august 2020 13:25:03
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int n,m,t,A,B,a[100010],aint[100010];

void start_up(int poz,int l,int r){
	if(l==r){
		aint[poz]=a[l];
		return ;
	}
	int mi=(l+r)/2;
	start_up(2*poz,l,mi);
	start_up(2*poz+1,mi+1,r);
	aint[poz]=max(aint[poz*2],aint[poz*2+1]);
	return ;
}

int get_max(int poz,int l,int r){
	if(r<A||B<l)return 0;
	if(A<=l&&r<=B)return aint[poz];
	int mi=(l+r)/2;
	return max(get_max(poz*2,l,mi),get_max(poz*2+1,mi+1,r));
}

void upd(int poz,int l,int r){
	if(r<A||A<l)return;
	if(l==r){aint[poz]=a[l]=B;return;}
	int mi=(l+r)/2;
	upd(poz*2,l,mi);
	upd(poz*2+1,mi+1,r);
	aint[poz]=max(aint[poz*2],aint[poz*2+1]);
	return ;
}

int main(){
	f>>n>>m;
	for(int i=1;i<=n;i++)
		f>>a[i];
	start_up(1,1,n);
	for(int i=1;i<=m;i++){
		f>>t>>A>>B;
		if(t==0){
			g<<get_max(1,1,n)<<'\n';
			continue;
		}
		a[A]=B;
		upd(1,1,n);
	}
}