Pagini recente » Cod sursa (job #1641063) | Cod sursa (job #2615834) | Cod sursa (job #2214816) | Atasamentele paginii gimnaziu_3 | Cod sursa (job #1656364)
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100002;
int rangeTree[2 * NMAX];
int updateValue, updateIndex;
void rangeTreeUpdate (const int left, const int right, const int node) {
if (left == right) {
rangeTree[node] = updateValue;
return;
}
int middle = left + right >> 1;
if (updateIndex <= middle)
rangeTreeUpdate (left, middle, node * 2);
else
rangeTreeUpdate (middle + 1, right, node * 2 + 1);
rangeTree[node] = max (rangeTree[node * 2], rangeTree[node * 2 + 1]);
}
int queriedLeft, queriedRight;
int rangeTreeQuery (const int left, const int right, const int node) {
if (left > queriedRight || right < queriedLeft)
return 0;
if (left >= queriedLeft && right <= queriedRight)
return rangeTree[node];
int middle = left + right >> 1;
return max (
rangeTreeQuery (left, middle, node * 2),
rangeTreeQuery (middle + 1, right, node * 2 + 1)
);
}
int main () {
freopen ("arbint.in", "r", stdin);
freopen ("arbint.out", "w", stdout);
int N, M;
scanf ("%d%d", &N, &M);
for (updateIndex = 1; updateIndex <= N; ++updateIndex) {
scanf ("%d", &updateValue);
rangeTreeUpdate(1, N, 1);
}
while (M--) {
int operation, a, b;
scanf ("%d", &operation);
scanf ("%d%d", &a, &b);
switch (operation) {
case 0:
queriedLeft = a;
queriedRight = b;
printf ("%d\n", rangeTreeQuery(1, N, 1));
break;
case 1:
updateIndex = a;
updateValue = b;
rangeTreeUpdate (1, N, 1);
break;
}
}
}