Cod sursa(job #2072222)

Utilizator Draganoid345Rusnac Dragos Draganoid345 Data 21 noiembrie 2017 16:25:43
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("arbint.in");
	ofstream fout("arbint.out");
//update(st,dr,nod)
int h[400001],n,idx,nr,x,m,l,r,flag;
//int hmin[400001];
void update(int st, int dr, int pos){
	if(st==dr){
		h[pos]=nr;
		return;
	}
	int mid=(st+dr)/2;
	if(idx<=mid) update(st,mid,2*pos);
	else update(mid+1,dr,2*pos+1);
	h[pos]=max(h[2*pos],h[2*pos+1]);
}

int query(int st,int dr,int pos){
	//l,d interval pe care cautam sol;
	if(l<=st && dr<=r) return h[pos];
	int mid=(st+dr)/2;
	int left=0,right=0;
	if(l<=mid) left=query(st,mid,2*pos);
	if(r>mid) right=query(mid+1,dr,2*pos+1);
	return max(left,right);
}

/*
void updatemin(int st, int dr, int pos){
	if(st==dr){
		hmin[pos]=nr;
		return;
	}
	int mid=(st+dr)/2;
	if(idx<=mid) updatemin(st,mid,2*pos);
	else updatemin(mid+1,dr,2*pos+1);
	hmin[pos]=min(hmin[2*pos],hmin[2*pos+1]);
}

int querymin(int st,int dr,int pos){
	//l,d interval pe care cautam sol;
	if(l<=st && dr<=r) return hmin[pos];
	int mid=(st+dr)/2;
	int left=0,right=0;
	if(l<=mid) left=querymin(st,mid,2*pos);
	if(r>mid) right=querymin(mid+1,dr,2*pos+1);
	return min(left,right);
}

*/





int main(){
	
	fin>>n>>m;
	for(int i=1;i<=n;i++){
		fin>>x;
		idx=i;
		nr=x;
		update(1,n,1);
//		updatemin(1,n,1);
	}
	for(int i=1;i<=m;i++){
		fin>>flag>>l>>r;
		if(flag){
			idx = l;
			nr = r;
		update(1,n,1);
		} else {
			fout << query(1, n, 1);
			fout<<'\n';
		}
		
	}
		
}