Pagini recente » Cod sursa (job #893185) | Cod sursa (job #3138363) | Cod sursa (job #983727) | Cod sursa (job #3272802) | Cod sursa (job #2769502)
#include <fstream>
using namespace std;
ifstream cin ("arbint.in");
ofstream cout ("arbint.out");
const int maxn=100000;
int start, queryType, x, y, n, m;
int a[4*maxn];
void update(int newValue, int nod){
a[nod]=newValue;//punem valoarea initiala
while(nod!=1){//cata vreme mai pot urca
nod/=2;//urcam un nod
a[nod]=max(a[2*nod], a[2*nod+1]);//actualizez cu maximul dinre fii
}
}
int query(int lo, int hi){
if(lo>hi)
return 0;
int leftValue=0, rightValue=0;
if(lo==hi)
return a[lo];
if(lo%2==1){
leftValue=a[lo];
lo++;
}
if(hi%2==0){
rightValue=a[hi];
hi--;//daca am include noduri noi, n-ar merge nimic, aa ca ne deplasam st-dr
}
lo/=2, hi/=2;//mergem un nivel mai sus
return max(max(leftValue, rightValue), query(lo, hi));
}
int main() {
cin >> n >> m;
start = 1;
while (start < n)
start <<= 1;
for(int i=start; i<start+n; i++){
cin>>a[i];
update(a[i], i);//actualizam arborele
}
for(int i=0; i<m; i++){
cin>>queryType>>x>>y;
if(queryType==0){//daca
cout<<query(x+start-1, y+start-1) << '\n';
}
else{
update(y, x+start-1);
}
}
return 0;
}