Pagini recente » Cod sursa (job #1765801) | Cod sursa (job #2092366) | Cod sursa (job #2472682) | Cod sursa (job #3182680) | Cod sursa (job #2873565)
#include <bits/stdc++.h>
using namespace std;
/**
Intr-un arbore binar complet a radacina este a[1]
si pentru fiecare nod i informatia este memorata in a[i]
iar fiii sai (daca exista) sunt a[2*i] si a[2*i+1].
*/
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int a[510000], n;
void Update(int p, int x)
{
int t;
a[p] = x;
while (p >= 1)
{
t = p / 2;
a[t] = max(a[2 * t], a[2 * t + 1]);
p = t;
}
}
/**
p = nodul unde ne aflam (initial p=1, adica radacina)
[x,y] - intervalul in care vream sa aflam maximul
[st, dr] = intervalul reprezentat de nodul p
*/
int Query(int p, int x, int y, int st, int dr)
{
if (x == st && y == dr) return a[p];
int m = (st + dr) / 2;
if (y <= m) return Query(2 * p, x, y, st, m);
if (m + 1 <= x) return Query(2 * p + 1, x, y, m + 1, dr);
/// sunt in cazul x <= m < y
return max(Query(2 * p, x, m, st, m),
Query(2 * p + 1, m + 1, y, m + 1, dr));
}
int main()
{
int m, i, k, op, x, y;
fin >> n >> m;
/// aflu in k cea mai mica putere a lui 2 >= n
for (k = 1; k < n; k = k * 2)
;
for (i = k; i < k + n; i++)
fin >> a[i];
n = k;
for (i = n - 1; i >= 1; i--)
a[i] = max(a[2 * i], a[2 *i + 1]);
while (m--)
{
fin >> op >> x >> y;
if (op == 1) Update(n - 1 + x, y);
else fout << Query(1, x, y, 1, n) << "\n";
}
fout.close();
return 0;
}