Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- void solve();
- int maximum_length(int N, vector<int> &Y);
- int query(vector<int> &tree, int v, int tl, int tr, int l, int r);
- void update(vector<int> &tree, int v, int tl, int tr, int pos, int new_val);
- int main() {
- int t = 1;
- scanf("%d", &t);
- while (t--) solve();
- return 0;
- }
- void solve() {
- int n, i, j;
- scanf("%d", &n);
- vector<int> arr(n);
- for (i = 0; i < n; ++i) scanf("%d", &arr[i]);
- printf("%d\n", maximum_length(n, arr));
- }
- int maximum_length(int N, vector<int> &Y) {
- vector<pair<int, int>> temp;
- int i;
- for (i = 0; i < N; ++i) temp.push_back({Y[i], i});
- sort(temp.begin(), temp.end());
- vector<int> indices(N), val(N);
- for (i = 0; i < N; ++i) {
- val[i] = temp[i].first;
- indices[i] = temp[i].second;
- }
- int ans = 0;
- vector<int> tree(4 * N);
- for (i = 0; i < N; ++i) {
- update(tree, 1, 1, 2 * N, i + 1, indices[i]);
- }
- for (i = 0; i < N; ++i) {
- int ind = lower_bound(val.begin(), val.end(), Y[i]) - val.begin();
- if (ind != 0) {
- int idx = query(tree, 1, 1, 2 * N, 1, ind);
- ans = max(ans, i - idx);
- }
- }
- return ans;
- }
- int query(vector<int> &tree, int v, int tl, int tr, int l, int r) {
- if (l > r)
- return INT32_MAX;
- if (l == tl && r == tr)
- return tree[v];
- int tm = (tl + tr) / 2;
- 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));
- }
- void update(vector<int> &tree, int v, int tl, int tr, int pos, int new_val) {
- if (tl == tr)
- tree[v] = new_val;
- else {
- int tm = (tl + tr) / 2;
- if (pos <= tm)
- update(tree, 2 * v, tl, tm, pos, new_val);
- else
- update(tree, 2 * v + 1, tm + 1, tr, pos, new_val);
- tree[v] = min(tree[2 * v], tree[2 * v + 1]);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment