Submission #713026

#TimeUsernameProblemLanguageResultExecution timeMemory
713026garyyeWall (IOI14_wall)C++14
100 / 100
1262 ms84504 KiB
#include "wall.h"
#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> pii;
#define fi first
#define se second

const int ADD = 1;
const int DEL = 2;
const int N = 2e6 + 5;
const int INF = 1e9+10;

int mn[N * 4], mx[N * 4];
int* H;

// i <= j 
int clamp(int x, int i, int j) {
  return min(max(x, i), j);
}

void pull(int u) {
  int p = u >> 1;
  mx[u] = clamp(mx[u], mn[p], mx[p]);
  mn[u] = clamp(mn[u], mn[p], mx[p]);
}

void update(int u, int L, int R, int i, int j, int op, int x) {
  if(j < L || R < i) {
    return;
  }

  if(i <= L && R <= j) {
    if(op == ADD) {
      mn[u] = max(mn[u], x);
      mx[u] = max(mx[u], mn[u]);
    } else {
      mx[u] = min(mx[u], x);
      mn[u] = min(mn[u], mx[u]);
    }
    if(L == R) {
      H[L] = clamp(0, mn[u], mx[u]);
    }
  } else {
    int mid = (L + R) >> 1;

    pull(u * 2);
    pull(u * 2 + 1);
    mn[u] = 0, mx[u] = INF;

    update(u * 2, L, mid, i, j, op, x);
    update(u * 2 + 1, mid + 1, R, i, j, op, x);
  }
}



void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
  fill(mx, mx + N * 4, 1e9 + 10);
  H = finalHeight;
  for(int i = 0; i < k; ++i) {
    update(1, 0, n - 1, left[i], right[i], op[i], height[i]);
  }
  for(int i = 0; i < n; ++i) {
    update(1, 0, n - 1, i, i, ADD, 0);
  }

}

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