Submission #1187604

#TimeUsernameProblemLanguageResultExecution timeMemory
1187604kunzaZa183Wall (IOI14_wall)C++20
100 / 100
530 ms96848 KiB
#include "wall.h"

#include <bits/stdc++.h>
using namespace std;

int n;
vector<pair<int, int>> lazy;
vector<int> last;

void lz(int curin, int curl, int curr) {
  if (curl == curr) {
    if (last[curl] < lazy[curin].first) {
      last[curl] = lazy[curin].first;
    } else if (last[curl] > lazy[curin].second) {
      last[curl] = lazy[curin].second;
    }
    lazy[curin] = {0, INT_MAX};
    return;
  }

  if (lazy[curin * 2 + 1].second < lazy[curin].first) {
    lazy[curin * 2 + 1] = {lazy[curin].first, lazy[curin].first};
  } else if (lazy[curin].second < lazy[curin * 2 + 1].first) {
    lazy[curin * 2 + 1] = {lazy[curin].second, lazy[curin].second};
  } else {
    lazy[curin * 2 + 1] = {max(lazy[curin].first, lazy[curin * 2 + 1].first),
                           min(lazy[curin].second, lazy[curin * 2 + 1].second)};
  }

  if (lazy[curin * 2 + 2].second < lazy[curin].first) {
    lazy[curin * 2 + 2] = {lazy[curin].first, lazy[curin].first};
  } else if (lazy[curin].second < lazy[curin * 2 + 2].first) {
    lazy[curin * 2 + 2] = {lazy[curin].second, lazy[curin].second};
  } else {
    lazy[curin * 2 + 2] = {max(lazy[curin].first, lazy[curin * 2 + 2].first),
                           min(lazy[curin].second, lazy[curin * 2 + 2].second)};
  }

  lazy[curin] = {0, INT_MAX};
}

int ql, qr;
pair<int, int> qry;
void update(int curin = 0, int curl = 0, int curr = n - 1) {
  lz(curin, curl, curr);

  if (qr < curl || ql > curr) return;

  if (ql <= curl && curr <= qr) {
    lazy[curin] = qry;
    lz(curin, curl, curr);
    return;
  }

  update(curin * 2 + 1, curl, (curl + curr) / 2),
      update(curin * 2 + 2, (curl + curr) / 2 + 1, curr);
}

void ans(int curin = 0, int curl = 0, int curr = n - 1) {
  lz(curin, curl, curr);

  if (curl == curr) {
    return;
  }

  ans(curin * 2 + 1, curl, (curl + curr) / 2),
      ans(curin * 2 + 2, (curl + curr) / 2 + 1, curr);
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[],
               int finalHeight[]) {
  lazy = vector<pair<int, int>>(4 * n, {0, INT_MAX});
  ::n = n;
  last = vector<int>(n, 0);

  for (int i = 0; i < k; i++) {
    ql = left[i], qr = right[i];
    if (op[i] == 1) {
      qry = {height[i], INT_MAX};
    } else {
      qry = {0, height[i]};
    }
    update();
  }

  ans();

  for (int i = 0; i < n; i++) finalHeight[i] = last[i];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...