Pagini recente » Cod sursa (job #2680555) | Cod sursa (job #2220578) | Cod sursa (job #1209016) | Cod sursa (job #1655341) | Cod sursa (job #2404515)
#include <bits/stdc++.h>
using namespace std;
int a[100000],tree[100000],n,m;
int start,end,index,nod,treesize;
int querystart,queryend,val,x;
void update(int nod,int start,int end){
///fara overlap
if (x<start || x>end) return;
///a gasit nodul frunza
if (start==end){
tree[nod]=val;
return;
}
///in interval
int mid=(start+end)/2;
update(nod*2,start,mid);
update(nod*2+1,mid+1,end);
tree[nod]=min(tree[2*nod],tree[2*nod+1]);
return;
}
///elementul minim dintre subtree in intervalul querystart-queryend
int query(int nod,int start,int end){
///fara overlap
if (querystart>end || queryend<start) return INT_MAX;
///overlap complet
if (start>=querystart && end<=queryend) return tree[nod];
///overlap partial
int mid=(start+end)/2;
int min_st=query(nod*2,start,mid);
int min_dr=query(nod*2+1,mid+1,end);
return min(min_st,min_dr);
}
void build(int nod, int start, int end){
///cazul de baza- nodul frunza
if (start==end){
tree[nod]=a[start];
treesize++;
return;
}
///cazul recursiv
int mid=(start+end)/2;
///subtree stang
build(2*nod,start,mid);
///subtree drept
build(2*nod+1,mid+1,end);
int left=tree[nod*2];
int right=tree[nod*2+1];
tree[nod]=min(left,right);
treesize++;
}
int main(){
ifstream cin ("arbore.in");
cin>>n>>m;
for (int i=0;i<n;i++) cin>>a[i];
//tree[4*n+1] - lungimea
build(1,0,n-1);
for (int i=1;i<=treesize;i++) cout<<tree[i]<<" ";cout<<'\n';
cout<<"marimea pentru arbore: "<<treesize<<'\n'<<'\n';
while(m--){
int k; cin>>k;
if (k==1){
///x e pozitia in array care ia valoarea val
cin>>x>>val;
update(1,0,n-1);
cout<<"Arborele schimbat: "<<'\n';
for (int i=1;i<=treesize;i++) cout<<tree[i]<<" ";cout<<'\n';
}
else{
cin>>querystart>>queryend;
cout<<"Valoarea minima in intervalul ["<<querystart<<".."<<queryend<<"] este: ";
cout<<query(1,0,n-1)<<'\n';
}
}
return 0;
}