Cod sursa(job #3293928)

Utilizator anon2718281828Iasmina Matei anon2718281828 Data 13 aprilie 2025 15:43:07
Problema Arbori de intervale Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#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;
}