Submission #554674

#TimeUsernameProblemLanguageResultExecution timeMemory
554674Soumya1Wall (IOI14_wall)C++17
100 / 100
773 ms98168 KiB
#include "wall.h"
#include <bits/stdc++.h>
using namespace std;
const int mxN = 2e6 + 5;
struct Node {
  int mx = -1e9, mn = 1e9;
  Node() { }
  Node(int a, int b) { mn = a, mx = b; }
} t[4 * mxN];
void push(int x, Node v) {
  if (t[x].mn >= v.mn && v.mn >= t[x].mx) {
    t[x].mn = v.mn;
  } else if (v.mn < t[x].mx) {
    t[x] = Node(v.mn, v.mn);
  }
  if (t[x].mn >= v.mx && v.mx >= t[x].mx) {
    t[x].mx = v.mx;
  } else if (v.mx > t[x].mn) {
    t[x] = Node(v.mx, v.mx);
  }
}
void propagate(int x, int lx, int rx) {
  if (lx == rx) return;
  push(x << 1, t[x]);
  push(x << 1 | 1, t[x]);
  t[x] = Node(1e9, -1e9);
}
void update(int x, int lx, int rx, int l, int r, Node v) {
  if (t[x].mx != -1e9 || t[x].mn != 1e9) propagate(x, lx, rx);
  if (l > rx || lx > r) return;
  if (l <= lx && r >= rx) {
    push(x, v);
    return;
  }
  int mx = (lx + rx) >> 1;
  update(x << 1, lx, mx, l, r, v);
  update(x << 1 | 1, mx + 1, rx, l, r, v);
}
int query(int x, int lx, int rx, int i) {
  if (t[x].mx != -1e9 || t[x].mn != 1e9) propagate(x, lx, rx);
  if (lx == rx) {
    return max(t[x].mx, min(t[x].mn, 0));
  }
  int mx = (lx + rx) >> 1;
  if (i <= mx) return query(x << 1, lx, mx, i);
  return query(x << 1 | 1, mx + 1, rx, i);
}
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
  for (int i = 0; i < k; i++) {
    Node v = Node(1e9, height[i]);
    if (op[i] == 2) v = Node(height[i], -1e9);
    update(1, 1, n, left[i] + 1, right[i] + 1, v);
  }
  for (int i = 0; i < n; i++) {
    finalHeight[i] = query(1, 1, n, i + 1);
  }
  return;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...