Pagini recente » Cod sursa (job #1598782) | Cod sursa (job #2180629) | Cod sursa (job #2761118) | Cod sursa (job #2525304) | Cod sursa (job #2722631)
#include <iostream>
#include <fstream>
using namespace std;
int N, M;
int tree[4 * 100001 + 100];
void update(int, int, int);
void query(int, int, int);
int intervalStart, intervalEnd, maximum;
int intervalPosition, value;
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
// Program
f >> N >> M;
for (int i = 1; i <= N; i++)
{
f >> value;
intervalPosition = i;
update(1, 1, N);
}
for (int i = 0; i < M; i++)
{
int c, a, b;
f >> c >> a >> b;
// Query
if (c == 0)
{
maximum = -1;
intervalStart = a;
intervalEnd = b;
query(1, 1, N);
g << maximum << '\n';
}
// c == 1
else
{
intervalPosition = a;
value = b;
update(1, 1, N);
}
}
// Exit
f.close();
g.close();
return 0;
}
void update(int treePos, int treeStart, int treeEnd)
{
if (treeStart == treeEnd)
{
tree[treePos] = value;
return;
}
int mij = (treeStart + treeEnd) / 2;
if (intervalPosition <= mij)
update(2 * treePos, treeStart, mij);
else
update(2 * treePos + 1, mij + 1, treeEnd);
tree[treePos] = max(tree[2 * treePos], tree[2 * treePos + 1]);
}
void query(int treePos, int treeStart, int treeEnd)
{
if (intervalStart <= treeStart && treeEnd <= intervalEnd)
{
maximum = max(maximum, tree[treePos]);
return;
}
int mij = (treeStart + treeEnd) / 2;
if (intervalStart <= mij) query(2 * treePos, treeStart, mij);
if (mij + 1 <= intervalEnd) query(2 * treePos + 1, mij + 1, treeEnd);
}