Pagini recente » Cod sursa (job #2227763) | Cod sursa (job #493157) | Cod sursa (job #1922825) | Cod sursa (job #2901967) | Cod sursa (job #1869158)
#include <cmath>
#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
#define MAX 100001
int n, m, x, y, c, l, k;
int b[MAX], a[MAX];
int St[MAX], Dr[MAX];
void add()
{
a[x] = y;
for (int i = 1; i * l <= n; i++)
if (x >= l * (i - 1) + 1 && x <= l * i )
{
b[i] = -1;
for (int nod = l * (i-1) + 1; nod <= l*i; nod++)
b[i] = max(b[i], a[nod]);
break;
}
}
int query()
{
int mx = -1;
int st = (1<<30), dr=-1;
for (int i = 1; i <= k; i++)
{
if (x <= St[i] && Dr[i] <= y)
{
if (St[i] < st) st = St[i];
if (Dr[i] > dr) dr = Dr[i];
mx = max(mx, b[i]);
}
if (Dr[i] > y) break;
}
if (st == (1<<30) && dr == -1) st = dr = y;
for (int i = x; i <= st; i++)
mx = max(mx, a[i]);
for (int i = dr; i <= y; i++)
mx = max(mx, a[i]);
return mx;
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; i++)
fin >> a[i];
l = sqrt(n);
k = n/l + 1;
for (int i = 1; i * l <= n; i++)
{
b[i] = -1;
St[i] = l*(i-1)+1;
Dr[i] = l*i;
for (int nod = St[i]; nod <= Dr[i]; nod++)
b[i] = max(b[i], a[nod]);
}
for (int i = 1; i <= m; i++)
{
fin >> c >> x >> y;
if (c) add();
else fout << query() << '\n';
}
return 0;
}