Pagini recente » Cod sursa (job #2856962) | Diferente pentru utilizator/pavelrazvan intre reviziile 139 si 140 | Cod sursa (job #2414373) | Cod sursa (job #2614465)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
struct Nod
{
int x, st, dr, t, a, b;
bool info;
};
int n, m, cnt, V[100001], I[100001];
Nod A[200001];
void Constr(int a, int b, int ind)
{
if (a == b)
{
A[ind].x = V[a];
A[ind].st = A[ind].dr = 0;
A[ind].a = A[ind].b = a;
I[a] = ind;
}
else
{
A[++cnt].t = ind;
A[cnt].info = false;
A[ind].st = cnt;
Constr(a, (a + b) / 2, cnt);
A[ind].a = A[A[ind].st].a;
A[++cnt].t = ind;
A[cnt].info = true;
A[ind].dr = cnt;
Constr((a + b) / 2 + 1, b, cnt);
A[ind].x = max(A[A[ind].st].x, A[A[ind].dr].x);
A[ind].b = A[A[ind].dr].b;
}
}
void GetMax(int &a, int &b, int nod, int& ma)
{
ma = max(ma, A[nod].x);
if (A[nod].b < b)
{
if (!A[nod].info && A[A[nod].t].b <= b)
GetMax(a, b, A[nod].t, ma);
else GetMax(a, b, I[A[nod].b + 1], ma);
}
}
void UpdateMax(int nod)
{
if (nod == 0)
return;
if (max(A[A[nod].st].x, A[A[nod].dr].x) != A[nod].x)
{
A[nod].x = max(A[A[nod].st].x, A[A[nod].dr].x);
UpdateMax(A[nod].t);
}
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; ++i)
fin >> V[i];
Constr(1, n, 1);
for (int i = 1; i <= m; ++i)
{
int c, a, b;
fin >> c >> a >> b;
if (c == 0)
{
int ma = 0;
GetMax(a, b, I[a], ma);
fout << ma << '\n';
}
else
{
A[I[a]].x = b;
UpdateMax(A[I[a]].t);
}
}
return 0;
}