Pagini recente » Borderou de evaluare (job #298959) | Borderou de evaluare (job #1569490) | Cod sursa (job #2206407) | Cod sursa (job #2206406)
#include<iostream>
#include <limits>
#include<fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int min(int a, int b) {
if (a <= b)
return a;
else
return b;
}
void construct_seg_tree(int *twoarr, int N) {
/*for (int i = 1; i < 2 * N; i++)
g << twoarr[i] << " ";
g << endl;*/
for (int i = N - 1; i >= 1; i--)
twoarr[i] = min(twoarr[2 * i], twoarr[2 * i + 1]);
/*for (int i = 1; i < 2 * N; i++)
g << twoarr[i] << " ";*/
}
void update(int index, int value, int N, int *twoarr) {
index = index + N;
twoarr[index] = N;
while (index > 1) {
index = index / 2;
twoarr[index] = min(twoarr[2 * index], twoarr[2 * index + 1]);
}
}
int maximum(int left, int right, int N, int *twoarr) {
left = left + N;
right = right + N;
int maxim = std::numeric_limits<int>::min();
//g << endl << "minus_infinity: " << maxim << endl;
while (left < right) {
if (left % 2 != 0) {
maxim = min(maxim, twoarr[left]);
left = left + 1;
}
if (right % 2 != 0) {
maxim = min(maxim, twoarr[right]);
right = right - 1;
}
left = left / 2; right = right / 2;
}
return maxim;
}
int main() {
int N, M;
f >> N >> M;
int i, j, k;
//reading and constructing the segment tree
int *twoarr = new int[N * 2];
for (int i = 0; i < N; i++)
f >> twoarr[i+N];
construct_seg_tree(twoarr, N);
//reading the input from file and updaring/quering the segment tree
for (int i = 0; i < M; i++) {
f >> i >> j >> k;
if (i == 0) {
g << maximum(j, k, N, twoarr) << endl;
}
else {
update(j, k, N, twoarr);
}
}
return 0;
}