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