Pagini recente » Cod sursa (job #2448265) | Cod sursa (job #185321) | Cod sursa (job #608417) | Cod sursa (job #1553939) | Cod sursa (job #2216708)
#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;
int desiredA;
int desiredB;
inline int Max(int a, int b)
{
if (a > b)
return a;
return b;
}
void InsertTree(int node, int left, int right)
{
if (left == right)
{
tree[node] = values[left];
}
else
{
int middle = (left + right) / 2;
if (desiredA <= middle)
{
InsertTree(node * 2, left, middle);
}
else
{
InsertTree((node * 2) + 1, middle + 1, right);
}
tree[node] = Max(tree[node * 2], tree[(node * 2) + 1]);
}
}
void Query(int node, int left, int right)
{
if (desiredA <= left && right <= desiredB)
{
queryResult = Max(queryResult, tree[node]);
}
else
{
int middle = (left + right) / 2;
if (desiredA <= middle)
{
Query(node * 2, left, middle);
}
if (desiredB > middle)
{
Query((node * 2) + 1, middle + 1, right);
}
}
}
int main(void)
{
fin >> n >> m;
for (int i = 1; i <= n; i++)
{
fin >> values[i];
desiredA = i;
desiredB = i;
InsertTree(1, 1, n);
}
for (int i = 1; i <= m; i++)
{
int task;
int a, b;
fin >> task >> a >> b;
queryResult = -1;
if (!task)
{
desiredA = a;
desiredB = b;
Query(1, 1, n);
fout << queryResult << endl;
}
else
{
values[a] = b;
desiredA = a;
desiredB = a;
InsertTree(1, 1, n);
}
}
fin.close();
fout.close();
return 0;
}