Pagini recente » Cod sursa (job #1066490) | Cod sursa (job #2216706)
#include <iostream>
#include <fstream>
#define MAX_N 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n;
int m;
int values[MAX_N] = { 0 };
int tree[2 * MAX_N] = { 0 };
int queryResult = -1;
inline int Max(int a, int b)
{
if (a > b)
return a;
return b;
}
void InsertTree(int node, int left, int right, int& a, int& b)
{
if (left == right)
{
tree[node] = values[left];
}
else
{
int middle = (left + right) / 2;
if (a <= middle)
{
InsertTree(node * 2, left, middle, a, b);
}
else
{
InsertTree((node * 2) + 1, middle + 1, right, a, b);
}
tree[node] = Max(tree[node * 2], tree[(node * 2) + 1]);
}
}
void Query(int node, int left, int right, int& a, int& b)
{
if (a <= left && right <= b)
{
queryResult = Max(queryResult, tree[node]);
}
else
{
int middle = (left + right) / 2;
if (a <= middle)
{
Query(node * 2, left, middle, a, b);
}
if (b > middle)
{
Query((node * 2) + 1, middle + 1, right, a, b);
}
}
}
int main(void)
{
fin >> n >> m;
for (int i = 1; i <= n; i++)
{
fin >> values[i];
InsertTree(1, 1, n, i, i);
}
for (int i = 1; i <= m; i++)
{
int task;
int a, b;
fin >> task >> a >> b;
queryResult = -1;
if (!task)
{
Query(1, 1, n, a, b);
fout << queryResult << endl;
}
else
{
values[a] = b;
InsertTree(1, 1, n, a, a);
}
}
fin.close();
fout.close();
return 0;
}