Pagini recente » Cod sursa (job #2204185) | Cod sursa (job #184065) | Cod sursa (job #1876654) | Cod sursa (job #2180081) | Cod sursa (job #2849834)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
struct st {
int val;
int l, r;
};
pair <int, int> v[100010];
st t[200010];
int gen(int pos, int l, int r)
{
t[pos].l = l;
t[pos].r = r;
if (l == r)
{
t[pos].val = v[l].first;
v[l].second = pos;
return v[l].first;
}
int mid = (l + r) / 2;
int val1 = gen(pos * 2, l, mid);
int val2 = gen(pos * 2 + 1, mid + 1, r);
t[pos].val = max(val1, val2);
return t[pos].val;
}
int query(int pos, int l, int r)
{
if (t[pos].l == l && t[pos].r == r)
{
return t[pos].val;
}
int mid = (t[pos].l + t[pos].r) / 2;
if (r <= mid)
return query(pos * 2, l, r);
if (l > mid)
return query(pos * 2 + 1, l, r);
int val1 = (t[pos].l == l ? t[pos * 2].val : query(pos * 2, l, mid));
int val2 = (t[pos].r == r ? t[pos * 2 + 1].val : query(pos * 2 + 1, mid + 1, r));
return max(val1, val2);
}
void update(int pos)
{
t[pos].val = max(t[pos * 2].val, t[pos * 2 + 1].val);
if (pos > 1)
update(pos / 2);
}
int main()
{
int N, M;
fin >> N >> M;
for (int i = 1; i <= N; i++)
{
fin >> v[i].first;
}
gen(1, 1, N);
int x, y;
bool o;
for (int i = 1; i <= M; i++)
{
fin >> o >> x >> y;
if (!o)
{
fout << query(1, x, y) << endl;
}
else
{
t[v[x].second].val = y;
update(v[x].second / 2);
}
}
return 0;
}