Submission #1138257

#TimeUsernameProblemLanguageResultExecution timeMemory
1138257AbdullahIshfaq밀림 점프 (APIO21_jumps)C++20
Compilation error
0 ms0 KiB
// #include "jumps.h"
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 2e5+5, LOG = 18;

int N, H[MAXN], L[MAXN][LOG], R[MAXN][LOG], T[MAXN][LOG], mx;
stack <int> st;

void init(int n, vector<int> h) {
  N = n;
  H[0] = H[N+1] = N+1;
  for (int i=1;i<=N;i++) {
    H[i] = h[i-1];
  }
  st.push(0);
  R[0][0] = R[N+1][0] = N+1;
  for (int i=1;i<=N+1;i++) {
    while (H[st.top()] < H[i]) {
      R[st.top()][0] = i;
      st.pop();
    }
    L[i][0] = st.top();
    st.push(i);
  }
  for (int i=0;i<=N+1;i++) {
    if (H[L[i][0]] > H[R[i][0]]) {
      T[i][0] = L[i][0];
    }
    else {
      T[i][0] = R[i][0];
    }
  }
  for (int i=1;i<LOG;i++) {
    for (int j=0;j<=N+1;j++) {
      T[j][i] = T[T[j][i-1]][i-1];
      L[j][i] = L[L[j][i-1]][i-1];
      R[j][i] = R[R[j][i-1]][i-1];
    }
  }
}

int minimum_jumps(int A, int B, int C, int D) {
  A++;
  B++;
  C++;
  D++;
  mx = B;
  for (int i=LOG-1;i>=0;i--) {
    if (R[mx][i] < C) {
      mx = R[mx][i];
    }
  }
  mx = R[mx][0];
  if (mx > D) {
    return -1;
  }
  for (int i=LOG-1;i>=0;i--) {
    if (H[L[B][i]] <= H[mx] && L[B][i] >= A) {
      B = L[B][i];
    }
  }
  if (L[B][0] >= A && R[L[B][0]][0] <= D) {
    return 1;
  }
  int ans = 0;
  for (int i=LOG-1;i>=0;i--) {
    if (H[T[B][i]] <= H[mx]) {
      ans += 1<<i;
      B = T[B][i];
    }
  }
  if (R[B][0] == mx) {
    return ans+1;
  }
  if (R[L[B][0]][0] <= D) {
    return ans+2;
  }
  for (int i=LOG-1;i>=0;i--) {
    if (R[B][i] <= mx) {
      ans += 1<<i;
      B = R[B][i];
    }
  }
  return ans;
}

int main() {
  int N, Q;
  assert(2 == scanf("%d %d", &N, &Q));
  std::vector<int> H(N);
  for (int i = 0; i < N; ++i) {
    assert(1 == scanf("%d", &H[i]));
  }
  init(N, H);

  for (int i = 0; i < Q; ++i) {
    int A, B, C, D;
    assert(4 == scanf("%d %d %d %d", &A, &B, &C, &D));
    printf("%d\n", minimum_jumps(A, B, C, D));
  }
  return 0;
}

Compilation message (stderr)

/usr/bin/ld: /tmp/cc36v192.o: in function `main':
stub.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccfDN6fU.o:jumps.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status