Submission #861115

#TimeUsernameProblemLanguageResultExecution timeMemory
861115MilosMilutinovicMatryoshka (JOI16_matryoshka)C++14
100 / 100
482 ms37436 KiB
/**
 *    author:  wxhtzdy
 *    created: 19.08.2023 16:20:10
**/
#include <bits/stdc++.h>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);  
  int n, q;
  cin >> n >> q;
  vector<int> a(n), b(n);
  for (int i = 0; i < n; i++) {
    cin >> a[i] >> b[i];
  }
  vector<int> x(q), y(q);
  for (int i = 0; i < q; i++) {
    cin >> x[i] >> y[i];
  }
  vector<int> xs;
  vector<int> ys;
  for (int i = 0; i < n; i++) {
    xs.push_back(a[i]);
    ys.push_back(b[i]);
  }
  for (int i = 0; i < q; i++) {
    xs.push_back(x[i]);
    ys.push_back(y[i]);
  }
  sort(xs.begin(), xs.end());
  sort(ys.begin(), ys.end());
  xs.erase(unique(xs.begin(), xs.end()), xs.end());
  ys.erase(unique(ys.begin(), ys.end()), ys.end());
  for (int i = 0; i < n; i++) {
    a[i] = (int) (lower_bound(xs.begin(), xs.end(), a[i]) - xs.begin());
    b[i] = (int) (lower_bound(ys.begin(), ys.end(), b[i]) - ys.begin());
  }
  for (int i = 0; i < q; i++) {
    x[i] = (int) (lower_bound(xs.begin(), xs.end(), x[i]) - xs.begin());
    y[i] = (int) (lower_bound(ys.begin(), ys.end(), y[i]) - ys.begin());
  }
  vector<int> order(n);
  iota(order.begin(), order.end(), 0);
  sort(order.begin(), order.end(), [&](int i, int j) {
    if (a[i] == a[j]) {
      return b[i] < b[j];
    } else {
      return a[i] > a[j];
    }
  });
  {
    vector<int> new_a(n);
    for (int i = 0; i < n; i++) {
      new_a[i] = a[order[i]];
    }
    a = new_a;
  }
  {
    vector<int> new_b(n);
    for (int i = 0; i < n; i++) {
      new_b[i] = b[order[i]];
    }
    b = new_b;
  }
  int sz = (int) ys.size();
  vector<int> st(8 * sz);
  function<void(int, int, int, int, int, int)> Modify = [&](int x, int l, int r, int ll, int rr, int v) {
    if (l > r || l > rr || r < ll || ll > rr) {
      return;
    }
    if (ll <= l && r <= rr) {
      st[x] = max(st[x], v);
      return;
    }
    int mid = l + r >> 1;
    Modify(x * 2, l, mid, ll, rr, v);
    Modify(x * 2 + 1, mid + 1, r, ll, rr, v);
  };
  function<int(int, int, int, int)> Query = [&](int x, int l, int r, int i) {
    if (l == r) {
      return st[x];
    }
    int mid = l + r >> 1;
    if (i <= mid) {
      return max(Query(x * 2, l, mid, i), st[x]);
    } else {
      return max(Query(x * 2 + 1, mid + 1, r, i), st[x]);
    }
  };
  vector<vector<int>> qs(n);
  for (int i = 0; i < q; i++) {
    int low = 0, high = n - 1, pos = 0;
    while (low <= high) {
      int mid = low + high >> 1;
      if (a[mid] >= x[i]) {
        pos = mid;
        low = mid + 1;
      } else {
        high = mid - 1;
      }
    }
    if (a[pos] >= x[i]) {
      qs[pos].push_back(i);
    }
  }
  vector<int> ans(q);
  for (int i = 0; i < n; i++) {
    Modify(1, 0, sz - 1, b[i], sz - 1, Query(1, 0, sz - 1, b[i]) + 1);
    for (int j : qs[i]) {
      ans[j] = Query(1, 0, sz - 1, y[j]);
    }
  }
  for (int i = 0; i < q; i++) {
    cout << ans[i] << '\n';
  }
  return 0;
}

Compilation message (stderr)

matryoshka.cpp: In lambda function:
matryoshka.cpp:77:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   77 |     int mid = l + r >> 1;
      |               ~~^~~
matryoshka.cpp: In lambda function:
matryoshka.cpp:85:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   85 |     int mid = l + r >> 1;
      |               ~~^~~
matryoshka.cpp: In function 'int main()':
matryoshka.cpp:96:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   96 |       int mid = low + high >> 1;
      |                 ~~~~^~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...