Pagini recente » Cod sursa (job #3239672) | Cod sursa (job #2020594) | Cod sursa (job #307719) | Cod sursa (job #2053075) | Cod sursa (job #3157597)
#include <fstream>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
ifstream cin("arbint.in");
ofstream cout("arbint.out");
struct Node {
ll l, r;
ll value = 0;
Node* leftNode = NULL;
Node* rightNode = NULL;
Node(ll l1, ll r1) : l(l1), r(r1) {}
void update(ll pos, ll nr) {
if (l == r) {
value = nr;
return;
}
ll m = (l + r) / 2;
if (pos <= m) {
if (leftNode == NULL) {
leftNode = new Node(l, m);
}
leftNode->update(pos, nr);
}
else {
if (rightNode == NULL) {
rightNode = new Node(m + 1, r);
}
rightNode->update(pos, nr);
}
value = 0;
if (leftNode != NULL) {
value =max(value, leftNode->value);
}
if (rightNode != NULL) {
value =max(value, rightNode->value);
}
}
ll query(ll st, ll end) {
if (st <= l && r <= end) {
return value;
}
ll m = (l + r) / 2;
ll res = 0;
if (st <= m) {
if (leftNode != NULL)
res = max(res, leftNode->query(st, end));
}
if (end > m) {
if (rightNode != NULL)
res =max(res, rightNode->query(st, end));
}
return res;
}
};
Node* root;
void build(Node*& root, ll n) {
root = new Node((ll)1, n);
queue<Node*> q;
q.push(root);
while (!q.empty()) {
auto node = q.front();
q.pop();
if (node->l == node->r)
continue;
ll m = (node->l + node->r) / 2;
node->leftNode = new Node(node->l, m);
node->rightNode = new Node(m + 1, node->r);
q.push(node->leftNode);
q.push(node->rightNode);
}
}
int main()
{
ll i, j, n,m,c, a, b;
cin >> n >> m;
build(root, n);
for (i = 0; i < n; i++) {
cin >> a;
root->update(i + 1, a);
}
while (m) {
cin >>c>> a >> b;
if (c) {
root->update(a, b);
}
else {
cout << root->query(a, b)<<"\n";
}
m--;
}
return 0;
}