Cod sursa(job #2514762)

Utilizator cyg_TheoPruteanu Theodor cyg_Theo Data 26 decembrie 2019 19:15:22
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int NMAX = 100000;

int v[NMAX];
int arbint[4*NMAX];

void update(int nod,int st,int dr,int poz,int val){
	if(st==dr){
		arbint[nod]=val;
		return;
	}
	int mid=(dr-st)/2+st;
	if(poz<=mid)
		update(nod<<1,st,mid,poz,val);
	else
		update((nod<<1)+1,mid+1,dr,poz,val);

	arbint[nod]=max(arbint[nod<<1],arbint[(nod<<1)+1]);
}

int query(int nod,int st,int dr,int a,int b){
	if(a<=st && dr<=b)
		return arbint[nod];

	int mid=(dr-st)/2+st;
	int maxim=-1;
	if(a<=mid)
		maxim=max(maxim,query(nod<<1,st,mid,a,b));
	if(mid<b)
		maxim=max(maxim,query((nod<<1)+1,mid+1,dr,a,b));

	return maxim;
}

int main(){
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);	
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i){
		scanf("%d",&v[i]);
		update(1,1,n,i,v[i]);
	}
	
	int q,a,b;
	for(int i=1;i<=m;++i){
		scanf("%d %d %d",&q,&a,&b);
		
		if(q==0){
			int x=query(1,1,n,a,b);
			printf("%d\n",x);
		}
		if(q==1){
			update(1,1,n,a,b);
		}
	}

	return 0;
}