#include <iostream>
#include <algorithm>
#include <vector>
#include <cassert>
using namespace std;
using ll = long long;
#define int ll
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define raya cerr << "==================" << endl;
#define fore(i, a, b) for(int i=a; i<b; ++i)
const int N = 2e5+5;
int p[N], n, q;
int mp[N];
struct Node {
Node *left, *right;
int val;
Node() {
left = nullptr;
right = nullptr;
val = 0;
}
};
int arr[N];
Node* version[N];
void init(Node *cur, int tl, int tr){
if(tl == tr){
cur->val = arr[tl];
return;
}
int tm = (tl + tr) / 2;
cur->left = new Node();
cur->right = new Node();
init(cur->left, tl, tm);
init(cur->right, tm+1, tr);
cur->val = cur->left->val + cur->right->val;
}
void update(Node *cur, Node *prev, int tl, int tr, int idx, int val){
if(tl == tr){
arr[tl] = val;
cur->val = val;
return;
}
int tm = (tl + tr) / 2;
if(idx <= tm){
cur->left = new Node();
cur->right = prev->right;
update(cur->left, prev->left, tl, tm, idx, val);
} else {
cur->left = prev->left;
cur->right = new Node();
update(cur->right, prev->right, tm+1, tr, idx, val);
}
cur->val = cur->left->val + cur->right->val;
}
void update(Node *cur, Node *prev, int idx, int val){
update(cur, prev, 0, N-1, idx, val);
}
int query(Node *cur, int tl, int tr, int l, int r){
if(l <= tl && tr <= r){
return cur->val;
}
if(r < tl or tr < l){
return 0;
}
int tm = (tl + tr) / 2;
int p1 = query(cur->left, tl, tm, l, r);
int p2 = query(cur->right, tm+1, tr, l, r);
return p1 + p2;
}
int query(Node *cur, int l, int r){
return query(cur, 0, N-1, l, r);
}
signed main(){
cin >> n >> q;
fore(i, 0, n){
cin >> p[i];
}
// vector<int> sorted;
// sorted.insert(sorted.begin(), p, p+n);
// sort(all(sorted));
// sorted.erase(unique(all(sorted)), sorted.end());
// fore(i, 0, sz(sorted)){
// mp[sorted[i]] = i;
// }
version[0] = new Node();
init(version[0], 0, N);
fore(i, 0, n){
version[i+1] = new Node();
// int key = mp[p[i]];
int prevVal = query(version[i], p[i], p[i]);
update(version[i+1], version[i], p[i], prevVal + 1);
}
fore(i, 0, q){
int l, r;
cin >> l >> r;
int low = 1, high = N;
int res = -1;
while(low <= high){
int mid = low + (high - low) / 2;
int cnt = query(version[r], mid, N-1) - query(version[l-1], mid, N-1);
if(cnt >= mid){
res = mid;
low = mid+1;
} else {
high = mid-1;
}
}
cout << res << endl;
// vector<int> tmp;
// tmp.insert(tmp.begin(), p+l-1, p+r);
// sort(tmp.rbegin(), tmp.rend());
// int low = 1, high = sz(tmp);
// int res = -1;
// while(low <= high){
// int mid = (low + high) / 2;
// if(tmp[mid-1] >= mid){
// res = mid;
// low = mid+1;
// } else {
// high = mid-1;
// }
// }
// assert( res > -1);
// cout << res << endl;
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
17 ms |
13400 KB |
Output is correct |
2 |
Correct |
17 ms |
13404 KB |
Output is correct |
3 |
Correct |
16 ms |
13500 KB |
Output is correct |
4 |
Correct |
17 ms |
13404 KB |
Output is correct |
5 |
Correct |
16 ms |
13404 KB |
Output is correct |
6 |
Correct |
17 ms |
13404 KB |
Output is correct |
7 |
Correct |
16 ms |
13404 KB |
Output is correct |
8 |
Correct |
17 ms |
13436 KB |
Output is correct |
9 |
Correct |
16 ms |
13400 KB |
Output is correct |
10 |
Correct |
18 ms |
13656 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
17 ms |
13400 KB |
Output is correct |
2 |
Correct |
17 ms |
13404 KB |
Output is correct |
3 |
Correct |
16 ms |
13500 KB |
Output is correct |
4 |
Correct |
17 ms |
13404 KB |
Output is correct |
5 |
Correct |
16 ms |
13404 KB |
Output is correct |
6 |
Correct |
17 ms |
13404 KB |
Output is correct |
7 |
Correct |
16 ms |
13404 KB |
Output is correct |
8 |
Correct |
17 ms |
13436 KB |
Output is correct |
9 |
Correct |
16 ms |
13400 KB |
Output is correct |
10 |
Correct |
18 ms |
13656 KB |
Output is correct |
11 |
Correct |
316 ms |
43816 KB |
Output is correct |
12 |
Correct |
326 ms |
44648 KB |
Output is correct |
13 |
Correct |
341 ms |
44368 KB |
Output is correct |
14 |
Correct |
309 ms |
44308 KB |
Output is correct |
15 |
Correct |
316 ms |
44680 KB |
Output is correct |
16 |
Correct |
311 ms |
44444 KB |
Output is correct |
17 |
Correct |
329 ms |
44384 KB |
Output is correct |
18 |
Correct |
340 ms |
44488 KB |
Output is correct |
19 |
Correct |
326 ms |
44600 KB |
Output is correct |
20 |
Correct |
340 ms |
44372 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
17 ms |
13400 KB |
Output is correct |
2 |
Correct |
17 ms |
13404 KB |
Output is correct |
3 |
Correct |
16 ms |
13500 KB |
Output is correct |
4 |
Correct |
17 ms |
13404 KB |
Output is correct |
5 |
Correct |
16 ms |
13404 KB |
Output is correct |
6 |
Correct |
17 ms |
13404 KB |
Output is correct |
7 |
Correct |
16 ms |
13404 KB |
Output is correct |
8 |
Correct |
17 ms |
13436 KB |
Output is correct |
9 |
Correct |
16 ms |
13400 KB |
Output is correct |
10 |
Correct |
18 ms |
13656 KB |
Output is correct |
11 |
Correct |
316 ms |
43816 KB |
Output is correct |
12 |
Correct |
326 ms |
44648 KB |
Output is correct |
13 |
Correct |
341 ms |
44368 KB |
Output is correct |
14 |
Correct |
309 ms |
44308 KB |
Output is correct |
15 |
Correct |
316 ms |
44680 KB |
Output is correct |
16 |
Correct |
311 ms |
44444 KB |
Output is correct |
17 |
Correct |
329 ms |
44384 KB |
Output is correct |
18 |
Correct |
340 ms |
44488 KB |
Output is correct |
19 |
Correct |
326 ms |
44600 KB |
Output is correct |
20 |
Correct |
340 ms |
44372 KB |
Output is correct |
21 |
Correct |
1562 ms |
139620 KB |
Output is correct |
22 |
Correct |
1524 ms |
139856 KB |
Output is correct |
23 |
Correct |
1561 ms |
139720 KB |
Output is correct |
24 |
Correct |
1534 ms |
139628 KB |
Output is correct |
25 |
Correct |
1525 ms |
139708 KB |
Output is correct |
26 |
Correct |
1533 ms |
139648 KB |
Output is correct |
27 |
Correct |
1645 ms |
139332 KB |
Output is correct |
28 |
Correct |
1535 ms |
140076 KB |
Output is correct |
29 |
Correct |
1577 ms |
139896 KB |
Output is correct |
30 |
Correct |
1550 ms |
139460 KB |
Output is correct |