Pagini recente » Cod sursa (job #2139620) | Cod sursa (job #926110) | Cod sursa (job #1332698) | Cod sursa (job #2296708) | Cod sursa (job #3293928)
#include <bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
struct Node {
int l, r;
int amax;
Node *parent;
unique_ptr<Node> left, right;
};
int getMaxFromRange(int l, int r, Node *n) {
if (!n || r < n->l || l > n->r)
return 0;
if (l <= n->l && r >= n->r)
return n->amax;
return max(getMaxFromRange(l, r, n->left.get()),
getMaxFromRange(l, r, n->right.get()));
}
int main() {
int n, m;
in >> n >> m;
vector<int> a(n + 1);
for (int i = 1; i <= n; i++)
in >> a[i];
vector<vector<int>> vmax(n + 1, vector<int>(n + 1));
for (int i = 1; i <= n; i++) {
vmax[i][i] = a[i];
for (int j = i + 1; j <= n; j++) {
vmax[i][j] = vmax[j][i] = max(a[j], vmax[i][j - 1]);
}
}
unique_ptr<Node> root = make_unique<Node>(Node{1, n, vmax[1][n]});
stack<Node *> stck({root.get()});
while (!stck.empty()) {
Node *curr = stck.top();
stck.pop();
if (curr->l == curr->r)
continue;
int m = (curr->l + curr->r) / 2;
int lmMax = vmax[curr->l][m];
int mrMax = vmax[m + 1][curr->r];
curr->left = make_unique<Node>(Node({curr->l, m, lmMax, curr}));
curr->right = make_unique<Node>(Node({m + 1, curr->r, mrMax, curr}));
stck.emplace(curr->left.get());
stck.emplace(curr->right.get());
}
while (m--) {
int x, y, z;
in >> x >> y >> z;
if (x == 0) {
int sol = getMaxFromRange(y, z, root.get());
out << sol << "\n";
} else if (x == 1) {
a[y] = z;
Node *n = root.get();
while (n) {
n->amax = *max_element(a.begin() + n->l, a.begin() + n->r + 1);
int m = (n->l + n->r) / 2;
if (y <= m) {
n = n->left.get();
} else {
n = n->right.get();
}
}
}
}
return 0;
}