Advertisement
Guest User

Juanzhang

a guest
Jun 5th, 2019
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxn = 1e5 + 10;
  5. int n, k, a[maxn];
  6.  
  7. struct persistent_trie {
  8.   static const int maxsz = maxn * 32;
  9.   int tot, rt[maxn], sz[maxsz], tid[maxsz], ch[2][maxsz];
  10.   void ins(int& k, int rt, int id, int x, int now) {
  11.     sz[k = ++tot] = sz[rt] + 1;
  12.     ch[0][k] = ch[0][rt], ch[1][k] = ch[1][rt];
  13.     if (now == -1) {
  14.       tid[k] = id; return;
  15.     }
  16.     int chk = x >> now & 1;
  17.     ins(ch[chk][k], ch[chk][rt], id, x, now - 1);
  18.   }
  19.   inline void build() {
  20.     for (int i = 1; i <= n; i++) {
  21.       ins(rt[i], rt[i - 1], i, a[i], 30);
  22.     }
  23.   }
  24.   inline int query(int l, int r, int x) {
  25.     int p = rt[l - 1], q = rt[r];
  26.     for (int i = 30; ~i; i--) {
  27.       int tmp = x >> i & 1, chk = sz[ch[tmp][q]] - sz[ch[tmp][p]] ? tmp : tmp ^ 1;
  28.       p = ch[chk][p], q = ch[chk][q];
  29.     }
  30.     return tid[q];
  31.   }
  32. } trie;
  33.  
  34. struct node {
  35.   int st, l, r, pos;
  36.   node(int _s = 0, int _l = 0, int _r = 0) :
  37.     st(_s), l(_l), r(_r), pos(trie.query(l, r, a[st])) {}
  38.   inline int get_val() const {
  39.     return a[pos] ^ a[st];
  40.   }
  41.   inline bool operator < (const node& o) const {
  42.     return get_val() > o.get_val();
  43.   }
  44. };
  45.  
  46. priority_queue <node> Q;
  47.  
  48. int main() {
  49.   scanf("%d %d", &n, &k);
  50.   for (int i = 1; i <= n; i++) {
  51.     scanf("%d", a + i);
  52.   }
  53.   trie.build();
  54.   for (int i = 1; i < n; i++) {
  55.     Q.push(node(i, i + 1, n));
  56.   }
  57.   while (k--) {
  58.     node p = Q.top();
  59.     printf("%d ", p.get_val()), Q.pop();
  60.     if (p.l < p.pos) Q.push(node(p.st, p.l, p.pos - 1));
  61.     if (p.pos < p.r) Q.push(node(p.st, p.pos + 1, p.r));
  62.   }
  63.   return 0;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement