Pagini recente » Cod sursa (job #1381991) | Cod sursa (job #2378000) | Cod sursa (job #696778) | Cod sursa (job #2769304) | Cod sursa (job #2404510)
#include <bits/stdc++.h>
using namespace std;
int a[100000],h[100000],n,m;
int st,dr,index,nod,treesize=0;
int x,y;
void update(int nod,int st,int dr){
//fară overlap
if (x<st || x>dr) return;
//a găsit nodul frunză
if (st==dr){
h[nod]=y;
return;
}
//se află in interval- x e între st și dr
int mid=(st+dr)/2;
update(nod*2,st,mid);
update(nod*2+1,mid+1,dr);
h[nod]=max(h[2*nod],h[2*nod+1]);
return;
}
///elementul minim din intervalul [x..y]
int query(int nod,int st,int dr){
//fară overlap->iese din interval
if (x>dr || y<st) return INT_MIN;
//overlap complet->a găsit intervalul în arbore
if (st>=x && dr<=y) return h[nod];
//overlap parțial
int mid=(st+dr)/2;
int max_st=query(nod*2,st,mid);
int max_dr=query(nod*2+1,mid+1,dr);
return max(max_st,max_dr);
}
void build(int nod, int start, int end){
///cazul de bază- nodul frunză
if (start==end){
h[nod]=a[start];
return;
}
///CAZUL RECURSIV:
int mid=(start+end)/2;
build(2*nod,start,mid); //<-subarbore stâng
build(2*nod+1,mid+1,end); //<-subarbore drept
//întoarcerea de la recursie:
int left=h[nod*2];
int right=h[nod*2+1];
h[nod]=max(left,right); //informația din nod
}
int main(){
ifstream cin ("arbint.in");
ofstream cout ("arbint.out");
cin>>n>>m;
for (int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(m--){
int k; cin>>k;
if (k==1){
cin>>x>>y;
update(1,1,n);
}
else{
cin>>x>>y;
//cout<<"Valoarea minima in intervalul ["<<x<<".."<<y<<"] este: ";
cout<<query(1,1,n)<<'\n';
}
}
return 0;
}