Submission #1129858

#TimeUsernameProblemLanguageResultExecution timeMemory
1129858aykhnEvent Hopping (BOI22_events)C++17
100 / 100
131 ms20416 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define inf 0x3F3F3F3F3F3F3F3F

const int MXN = 1e5 + 5;
const int LOG = 20;

int n, Q;
int p[LOG][MXN];
int l[MXN], r[MXN];

int go(int i, int j)
{
  return l[j] <= r[i] && r[i] <= r[j];
}

signed main()
{
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> Q;
  for (int i = 0; i < n; i++) cin >> l[i] >> r[i];
  int o[n];
  iota(o, o + n, 0);
  sort(o, o + n, [&](const int &x, const int &y)
  {
    return array<int, 2>{r[x], l[x]} < array<int, 2>{r[y], l[y]};
  });
  vector<int> v;
  for (int &i : o)
  {
    while (!v.empty() && l[v.back()] > l[i]) v.pop_back();
    v.push_back(i);
    int lx = 0, rx = (int)v.size() - 1;
    while (lx < rx)
    {
      int mid = (lx + rx) >> 1;
      if (r[v[mid]] >= l[i]) rx = mid;
      else lx = mid + 1;
    }
    p[0][i] = v[lx];
  }
  for (int i = 1; i < LOG; i++) for (int j = 0; j < n; j++) p[i][j] = p[i - 1][p[i - 1][j]];
  while (Q--)
  {
    int s, e;
    cin >> s >> e;
    s--, e--;
    if (s == e)
    {
      cout << 0 << '\n';
      continue;
    }
    if (go(s, e))
    {
      cout << 1 << '\n';
      continue;
    }
    int res = 0;
    for (int i = LOG - 1; i >= 0; i--)
    {
      if (l[p[i][e]] <= r[s]) continue;
      res += (1 << i);
      e = p[i][e];
    }
    if (go(s, p[0][e])) cout << res + 2 << '\n';
    else cout << "impossible\n";
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...