Cod sursa(job #2503082)

Utilizator 1chiriacOctavian Neculau 1chiriac Data 2 decembrie 2019 12:28:30
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>

using namespace std;
int n,v[(1<<17)+30],aint[2*(1<<17)+30],m;
void buildd () {
	for(int i=n;i<2*n;++i)
		aint[i]=v[i-n+1];
	for(int i=n-1;i>0;--i)
		aint[i]=max(aint[2*i],aint[2*i+1]);
}
void updatee (int poz,int nr) {
	int ind=n+poz-1;
	aint[ind]=nr;
	while(ind!=1) {
		ind=ind/2;
		aint[ind]=max(aint[2*ind],aint[2*ind+1]);
	}
	aint[1]=max(aint[2],aint[3]);
}
int querrys (int st,int dr,int cst, int cdr,int indexx) {
	if(cst>=st && cdr<=dr)
		return aint[indexx];
	else {
		int rez=0,mij=(cst+cdr)/2;
		if(st<=mij)
			rez=max(rez,querrys(st,dr,cst,mij,indexx*2));
		if(dr>mij)
			rez=max(rez,querrys(st,dr,mij+1,cdr,indexx*2+1));
		return rez;
	}
} 
int main () {
	int nr1,nr2,q,i;
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d%d", &n, &m);++m;
	for(int i=1;i<=n;++i)
		scanf("%d", &v[i]);
	for(i=1;(i<<1)<n;i<<=1);
	n=(i<<1);
	buildd();
	while(--m) {
		scanf("%d%d%d", &q, &nr1, &nr2);
		if(q==0)
			printf("%d\n", querrys(nr1,nr2,1,n,1));
		else
			updatee(nr1,nr2);
	}
	return 0;                 
}