Pagini recente » Cod sursa (job #850373) | Cod sursa (job #1910454) | Cod sursa (job #1692723) | Cod sursa (job #892686) | Cod sursa (job #2814338)
// Teo, e cod vechi dar m-ai rugat sa fac iterativ :)
#include <bits/stdc++.h>
using namespace std;
const int NMAX=1e5;
const int INFINIT=1e9+7;
const int LEN=(1<<18);
int v[LEN/2], tree[LEN], minn=NMAX;
int lstart, rstart;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
void build(int n){
for(int i=0; i<n; i++)
tree[i+n-1]=v[i];
for(int i=n-2; i>=0; i--)
tree[i]=max(tree[2*i+1], tree[2*i+2]);
}
void update(int poz, int val, int n){
tree[poz+n-1]=val;
int i=poz+n-1;
while(i>0){
if(i%2==1)
tree[(i-1)/2]=max(tree[i], tree[i+1]);
else
tree[(i-1)/2]=max(tree[i], tree[i-1]);
i=(i-1)/2;
}
}
void maximum(int i, int l, int r){ /// node i has interval [l, r]
if(rstart<l || lstart>r) return;
else if(l>=lstart && r<=rstart){
minn=max(minn, tree[i]);
return;
}else{
int mid=(l+r)/2;
maximum(2*i+1, l, mid);
maximum(2*i+2, mid+1, r);
}
}
int main(){
int n, m, op, l, r;
//cout<<(1<<18);
fin>>n>>m;
for(int i=0; i<n; i++) fin>>v[i];
int nn=1;
while(nn<=n) nn<<=1;
//cout<<nn<<endl;
for(int i=n; i<nn; i++) v[i]=-INFINIT;
build(nn);
for(int i=0; i<m; i++){
//int op, l, r;
fin>>op>>l>>r;
if(op==1){
update(l-1, r, nn);
//for(int i=0; i<2*nn-1; i++) cout<<tree[i]<<' ';
}else{
minn=-INFINIT;
lstart=l-1;
rstart=r-1;
maximum(0, 0, nn-1);
fout<<minn<<endl;
}
}
//for(int i=0; i<2*nn-1; i++) cout<<tree[i]<<' ';
return 0;
}