Advertisement
ivnikkk

Untitled

Nov 3rd, 2022
1,209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.00 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define all(a) a.begin(), a.end()
  4. #define int long long
  5. using namespace std;
  6. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  7. const int inf = INT_MAX;
  8. signed main() {
  9.     ios_base::sync_with_stdio(false);
  10.     cin.tie(nullptr);
  11.     int n, m; cin >> n >> m;
  12.     vector<int> a(n), dp_right(n + 1), dp_left(n + 1);
  13.     for (int i = 0; i < n; i++) {
  14.         cin >> a[i];
  15.         dp_right[i + 1] = inf + 1;
  16.         dp_left[i + 1] = inf;
  17.     }
  18.     dp_right[0] = -inf;
  19.     dp_left[0] = -inf;
  20.     vector<pair<int, int>> rebuild(n, {-1, -1});
  21.     for (int i = n - 1; i >= 0; i--) {
  22.         int j = upper_bound(all(dp_right), -a[i]) - dp_right.begin();
  23.         if (dp_right[j - 1] < -a[i]) {
  24.             rebuild[i] = {j, dp_right[j]};
  25.             dp_right[j] = -a[i];
  26.         }
  27.     }
  28.     vector<vector<pair<int, int>>> q(n);
  29.     for (int i = 0; i < m; i++) {
  30.         int pos, val; cin >> pos >> val;
  31.         pos--;
  32.         q[pos].push_back({val, i});
  33.     }
  34.     vector<int> res(m);
  35.     for (int i = 0; i < n; i++) {
  36.         if (rebuild[i] != pair<int, int>{-1, -1}) {
  37.             dp_right[rebuild[i].first] = rebuild[i].second;
  38.         }
  39.         for (int k = 0; k < (int)q[i].size(); k++) {
  40.             pair<int, int> rollback = {-1, -1};
  41.             int v, t; v = q[i][k].first, t = q[i][k].second;
  42.             int j = upper_bound(all(dp_left), v) - dp_left.begin();
  43.             //if(dp_left[l - 1] == v) { l--; }
  44.             if (dp_left[j - 1] < v) {
  45.                 rollback = { j, dp_left[j]};
  46.                 dp_left[j] = v;
  47.             }
  48.  
  49.             auto count = [&](int ind) {
  50.                 int val_ind = dp_left[ind];
  51.                 int rs = upper_bound(all(dp_right), -val_ind) - dp_right.begin();
  52.                 if (dp_right[rs - 1] == -val_ind) {
  53.                     rs--;
  54.                 }
  55.                 return rs + ind - 1;
  56.             };
  57.             int l = 1, r = upper_bound(all(dp_left), inf - 1) - dp_left.begin() - 1;
  58.             assert(l <= r);
  59.             while (r - l > 350) {
  60.                 int tl = l + (r - l) / 3;
  61.                 int tr = r - (r - l) / 3;
  62.                 if (count(tl) <= count(tr)) {
  63.                     l = tl;
  64.                 }
  65.                 else {
  66.                     r = tr;
  67.                 }
  68.             }
  69.             //int r = upper_bound(all(dp_right), -v) - dp_right.begin();
  70.             //if(dp_right[r - 1] == v) { r--; }
  71.             //res[t] = r + l - 1;
  72.             for (int b = l; b <= r; b++) {
  73.                 res[t] = max(res[t], count(b));
  74.             }
  75.             res[t] = max(res[t], count(0));
  76.             if (rollback != pair<int, int>{-1, -1}) {
  77.                 dp_left[rollback.first] = rollback.second;
  78.             }
  79.         }
  80.  
  81.         int j = upper_bound(all(dp_left), a[i]) - dp_left.begin();
  82.         if (dp_left[j - 1] < a[i]) {
  83.             dp_left[j] = a[i];
  84.         }
  85.     }
  86.     for (int i = 0; i < m; i++) {
  87.         cout << res[i] << '\n';
  88.     }
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement