Pagini recente » Cod sursa (job #1860858) | Cod sursa (job #675905) | Cod sursa (job #1600190) | Cod sursa (job #414365) | Cod sursa (job #2739356)
#define MAX_N 100000
#define LOG_MAX_N 17
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m, A[MAX_N + 1];
int T[LOG_MAX_N + 1][MAX_N + 1]; // T[e][ind]
void Set(int ind, int val)
{
T[0][ind] = val;
for (int e = 1; e <= LOG_MAX_N; ++e)
{
ind /= 2;
T[e][ind] = max(T[e - 1][ind * 2], T[e - 1][ind * 2 + 1]);
}
}
int Get(int st, int dr)
{
int ma = 0, e = 0, ind = st;
while (true)
{
int l = ind * (1 << e), r = l + (1 << e) - 1;
while (r > dr) // Daca depasesc dreapta ma mai micsorez.
{
ind *= 2;
--e;
l = ind * (1 << e), r = l + (1 << e) - 1;
}
while (ind % 2 == 0 && r + (1 << e) <= dr) // Ca sa pot mari trebuie sa fiu pe fiul din stanga (ind par) si sa imi incapa tot tatal in interval.
{
ind /= 2;
++e;
l = ind * (1 << e), r = l + (1 << e) - 1;
}
ma = max(ma, T[e][ind]);
if (r == dr)
return ma;
++ind;
}
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; ++i)
{
int x;
fin >> x;
Set(i, x);
}
for (int i = 1; i <= m; ++i)
{
int c, a, b;
fin >> c >> a >> b;
if (c == 0)
fout << Get(a, b) << '\n';
else
Set(a, b);
}
return 0;
}