Guest User

maximum_difference

a guest
Aug 8th, 2021
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.94 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. void solve();
  6. int maximum_length(int N, vector<int> &Y);
  7.  
  8. int query(vector<int> &tree, int v, int tl, int tr, int l, int r);
  9. void update(vector<int> &tree, int v, int tl, int tr, int pos, int new_val);
  10.  
  11. int main() {
  12.     int t = 1;
  13.     scanf("%d", &t);
  14.     while (t--) solve();
  15.     return 0;
  16. }
  17. void solve() {
  18.     int n, i, j;
  19.     scanf("%d", &n);
  20.     vector<int> arr(n);
  21.     for (i = 0; i < n; ++i) scanf("%d", &arr[i]);
  22.     printf("%d\n", maximum_length(n, arr));
  23. }
  24. int maximum_length(int N, vector<int> &Y) {
  25.     vector<pair<int, int>> temp;
  26.     int i;
  27.     for (i = 0; i < N; ++i) temp.push_back({Y[i], i});
  28.     sort(temp.begin(), temp.end());
  29.  
  30.     vector<int> indices(N), val(N);
  31.     for (i = 0; i < N; ++i) {
  32.         val[i] = temp[i].first;
  33.         indices[i] = temp[i].second;
  34.     }
  35.     int ans = 0;
  36.     vector<int> tree(4 * N);
  37.     for (i = 0; i < N; ++i) {
  38.         update(tree, 1, 1, 2 * N, i + 1, indices[i]);
  39.     }
  40.  
  41.     for (i = 0; i < N; ++i) {
  42.         int ind = lower_bound(val.begin(), val.end(), Y[i]) - val.begin();
  43.         if (ind != 0) {
  44.             int idx = query(tree, 1, 1, 2 * N, 1, ind);
  45.             ans = max(ans, i - idx);
  46.         }
  47.     }
  48.     return ans;
  49. }
  50.  
  51. int query(vector<int> &tree, int v, int tl, int tr, int l, int r) {
  52.     if (l > r)
  53.         return INT32_MAX;
  54.     if (l == tl && r == tr)
  55.         return tree[v];
  56.     int tm = (tl + tr) / 2;
  57.     return min(query(tree, 2 * v, tl, tm, l, min(r, tm)), query(tree, 2 * v + 1, tm + 1, tr, max(l, tm + 1), r));
  58. }
  59. void update(vector<int> &tree, int v, int tl, int tr, int pos, int new_val) {
  60.     if (tl == tr)
  61.         tree[v] = new_val;
  62.     else {
  63.         int tm = (tl + tr) / 2;
  64.         if (pos <= tm)
  65.             update(tree, 2 * v, tl, tm, pos, new_val);
  66.         else
  67.             update(tree, 2 * v + 1, tm + 1, tr, pos, new_val);
  68.         tree[v] = min(tree[2 * v], tree[2 * v + 1]);
  69.     }
  70. }
  71.  
Advertisement
Add Comment
Please, Sign In to add comment