Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <list>
- #include <unordered_map>
- #include <vector>
- using namespace std;
- const int max_n = 600001;
- int f[max_n];
- int d[max_n];
- int a[max_n];
- int get(int r) {
- int res = 0;
- while (r >= 0) {
- res += f[r];
- r = (r & (r + 1)) - 1;
- }
- return res;
- }
- void upd(int x, int d) {
- while (x < max_n) {
- f[x] += d;
- x |= (x + 1);
- }
- }
- int main() {
- int n, m, type;
- cin >> m >> n >> type;
- for (int i = 1; i <= n; i++) {
- upd(max_n / 2 + i, 1);
- d[i] = max_n / 2 + i;
- a[max_n / 2 + i] = i;
- }
- if (type == 1) {
- int cur = max_n / 2;
- vector<int> v;
- for (int i = 0; i < m; i++) {
- int x;
- cin >> x;
- v.push_back(get(d[x]));
- a[cur] = x;
- upd(d[x], -1);
- upd(d[x]=cur--, 1);
- }
- for (int i = 0; i < m; i++) {
- cout << v[i] << ' ';
- }
- } else {
- int cur = max_n / 2;
- vector<int> v;
- for (int i = 0; i < m; i++) {
- int x;
- cin >> x;
- int l = 0, r = max_n;
- while (r - l > 1) {
- int mid = (r + l) / 2;
- if (get(mid) >= x) {
- r = mid;
- } else {
- l = mid;
- }
- }
- x = a[r];
- v.push_back(a[r]);
- a[cur] = x;
- upd(d[x], -1);
- upd(d[x]=cur--, 1);
- }
- for (int i = 0; i < m; i++) {
- cout << v[i] << ' ';
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement