Pagini recente » Cod sursa (job #1006755) | Cod sursa (job #1057854) | Cod sursa (job #504888) | Cod sursa (job #918505) | Cod sursa (job #2216716)
#include <stdio.h>
#define MAX_N 100005
using namespace std;
FILE* fin;
FILE* fout;
int n;
int m;
int tree[4 * MAX_N + 100] = { 0 };
int desiredValue;
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] = desiredValue;
}
else
{
int middle = (left + right) / 2;
if (desiredA <= middle)
{
InsertTree(node * 2, left, middle);
}
if (desiredB > middle)
{
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 = fopen("arbint.in", "r");
fout = fopen("arbint.out", "w");
fscanf(fin, "%d %d", &n, &m);
for (int i = 1; i <= n; i++)
{
fscanf(fin, "%d", &desiredValue);
desiredA = i;
desiredB = i;
InsertTree(1, 1, n);
}
for (int i = 1; i <= m; i++)
{
int task;
int a, b;
fscanf(fin, "%d %d %d", &task, &a, &b);
if (!task)
{
queryResult = -1;
desiredA = a;
desiredB = b;
Query(1, 1, n);
fprintf(fout, "%d\n", queryResult);
}
else
{
desiredValue = b;
desiredA = a;
desiredB = a;
InsertTree(1, 1, n);
}
}
fclose(fin);
fclose(fout);
return 0;
}