Pagini recente » Cod sursa (job #1852438) | Cod sursa (job #2754781) | Cod sursa (job #1141033) | Cod sursa (job #1112675) | Cod sursa (job #2680059)
#include <stdio.h>
#include <vector>
#include <limits.h>
using namespace std;
class SegmentTree {
private:
int no_numbers;
vector<int> segTree;
public:
SegmentTree(vector<int> numbers);
void update(int index, int value);
int maximum(int left, int right);
};
SegmentTree::SegmentTree(vector<int> numbers) {
this->no_numbers = numbers.size();
this->segTree.resize(2 * this->no_numbers);
for (int i = 0; i < this->no_numbers; i++) {
this->segTree[i + this->no_numbers] = numbers[i];
}
for (int i = this->no_numbers - 1; i > 0; i--) {
this->segTree[i] = max(this->segTree[i * 2], this->segTree[i * 2 + 1]);
}
}
void SegmentTree::update(int index, int value) {
int node = index + this->no_numbers;
this->segTree[node] = value;
while (node > 1) {
node /= 2;
this->segTree[node] = max(this->segTree[node * 2], this->segTree[node * 2 + 1]);
}
}
int SegmentTree::maximum(int left, int right) {
int ans = INT_MIN;
int nodeleft = left + this->no_numbers;
int noderight = right + this->no_numbers;
while (nodeleft <= noderight) {
if (nodeleft % 2 == 1) {
ans = max(this->segTree[nodeleft], ans);
nodeleft++;
}
if (noderight % 2 == 0) {
ans = max(this->segTree[noderight], ans);
noderight--;
}
nodeleft /= 2;
noderight /= 2;
}
return ans;
}
int main() {
FILE * fin = fopen("arbint.in", "r");
FILE * fout = fopen("arbint.out", "w");
int n, m, option, a, b;
fscanf(fin, "%d%d", &n, &m);
vector<int> numbers(n);
for (int i = 0; i < n; i++) {
fscanf(fin, "%d", &numbers[i]);
}
SegmentTree segmentTree(numbers);
for (int i = 0; i < m; i++) {
fscanf(fin, "%d%d%d", &option, &a, &b);
if (option == 1) {
segmentTree.update(a - 1, b);
} else {
fprintf(fout, "%d\n", segmentTree.maximum(a - 1, b - 1));
}
}
fclose(fin);
fclose(fout);
return 0;
}