Pagini recente » Cod sursa (job #1951960) | Cod sursa (job #627220) | Cod sursa (job #575012) | Cod sursa (job #629292) | Cod sursa (job #2972530)
#include<bits/stdc++.h>
using namespace std;
// ifstream in ("arbint.in");
// ofstream out("arbint.out");
auto& in = cin;
auto& out = cout;
int const N = 100005;
int n, m, v[N];
int depth, leaves_idx;
int next2exp()
{
int pow=0;
for(int x=n; x; x/=2)
pow++;
// out<<pow<<'\n';
return pow;
}
void read()
{
in>>n>>m;
depth = next2exp();
leaves_idx = pow(2, depth) - 1;
// out<<leaves_idx<<endl;
for(int i=0; i<n; i++)
in>>v[leaves_idx+i];
}
void show()
{
int end = pow(2, depth+1) - 1;
for(int i=0; i<end; i++)
out<<v[i]<<' ';
out<<'\n';
}
int heapify(int p)
{
if(p>=leaves_idx) return v[p];
int left = heapify(2*p + 1);
int right = heapify(2*p + 2);
return v[p] = max(left, right);
}
int get(int p, int r, int s, int e)
{
if(s > e) {
// out<<p<<" "<<r<<" "<<s<<" "<<e<<"=";out<<"0\n";
return 0;
}
if(r == e - s + 1) {
// out<<p<<" "<<r<<" "<<s<<" "<<e<<"=";out<<v[p]<<endl;
return v[p];
}
int left = get(2*p + 1, r/2, s, min(e, r/2));
int right = get(2*p + 2, r/2, max(1, s-r/2), e-r/2);
// out<<p<<" "<<r<<" "<<s<<" "<<e<<"=";
// out<<max(left, right)<<"\n";
return max(left, right);
}
void put(int idx, int val)
{
int p = leaves_idx+idx-1;
v[p] = val;
do
{
int u;
if (p%2==0) p--;
u = p / 2;
int l = 2 * u + 1;
int r = 2 * u + 2;
v[u] = max(v[l], v[r]);
p = u;
}while(p);
}
int main(){
read();
heapify(0);
// show();
for(int i=0; i<m; i++)
{
int o, a, b;
in>>o>>a>>b;
if(o == 0)
out<<get(0, 8, a, b)<<endl;
else
put(a, b);
}
return 0;
}