Advertisement
Guest User

Untitled

a guest
Jul 27th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.37 KB | None | 0 0
  1. /*
  2.     Campion - Runda 7 - Mess
  3.     O (n * log(n) ^ 3)
  4. */
  5.  
  6. #include <cstdio>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <ctime>
  10. #include <algorithm>
  11. using namespace std;
  12.  
  13. #define Nmax 100010
  14. #define MAX (((long long)1 << 31) - 1)
  15.  
  16. struct Treap {
  17.  
  18.     int key, priority, nrfii;
  19.     Treap *left, *right;
  20.  
  21.     Treap (int key, int priority, int nrfii, Treap *left, Treap *right) {
  22.         this->key = key;
  23.         this->priority = priority;
  24.         this->left = left;
  25.         this->right = right;
  26.         this->nrfii = nrfii;
  27.     }
  28. };
  29.  
  30. int n, m, p, q, k, rez, val, IS;
  31. int v[Nmax], on[Nmax], s[Nmax];
  32. Treap *AI[4 * Nmax], *nil;
  33.  
  34. void read_data () {
  35.  
  36.     scanf ("%d %d", &n, &m);
  37.     for (int i = 1; i <= n; i++) {
  38.         scanf ("%d", &v[i]);
  39.         s[i] = v[i];
  40.         on[i] = 1;
  41.     }
  42.  
  43.     sort (s + 1, s + n + 1);
  44. }
  45.  
  46. void rotleft (Treap* &nod) {
  47.  
  48.     Treap *aux = nod->left;
  49.     nod->left = aux->right; aux->right = nod;
  50.     nod = aux;
  51.  
  52.     nod->nrfii = nod->left->nrfii + nod->right->nrfii + 1;
  53. }
  54.  
  55. void rotright (Treap* &nod) {
  56.  
  57.     Treap *aux = nod->right;
  58.     nod->right = aux->left; aux->left = nod;
  59.     nod = aux;
  60.  
  61.     nod->nrfii = nod->left->nrfii + nod->right->nrfii + 1;
  62. }
  63.  
  64. void balance (Treap* &nod) {
  65.  
  66.     if (nod->priority < nod->left->priority)
  67.         rotleft (nod);
  68.     if (nod->priority < nod->right->priority)
  69.         rotright (nod);
  70.  
  71.     nod->nrfii = nod->left->nrfii + nod->left->nrfii;
  72. }
  73.  
  74. void insert_treap (Treap* &nod, int key, int priority) {
  75.  
  76.     if (nod == nil) {
  77.         nod = new Treap (key, priority, 1, nil, nil);
  78.         return ;
  79.     }
  80.  
  81.     if (key < nod->key) insert_treap (nod->left, key, priority);
  82.     else if (key > nod->key) insert_treap (nod->right, key, priority);
  83.  
  84.     nod->nrfii = nod->left->nrfii + nod->right->nrfii + 1;
  85.  
  86.     balance (nod);
  87.  
  88.     nod->nrfii = nod->left->nrfii + nod->right->nrfii + 1;
  89. }
  90.  
  91. void erase_treap (Treap* &nod, int key) {
  92.  
  93.     if (key < nod->key)
  94.         erase_treap (nod->left, key);
  95.     else {
  96.         if (key > nod->key)
  97.             erase_treap (nod->right, key);
  98.         else {
  99.             if (nod->left == nil && nod->right == nil)
  100.                 delete nod, nod = nil;
  101.             else {
  102.                 if (nod->left->priority > nod->right->priority) rotleft (nod);
  103.                 else rotright (nod);
  104.                 erase_treap (nod, key);
  105.             }
  106.         }
  107.     }
  108.  
  109.     if (nod != nil)nod->nrfii = nod->left->nrfii + nod->right->nrfii + 1;
  110. }
  111.  
  112. #define MIJ ((st + dr) >> 1)
  113. #define N1 (nod << 1)
  114. #define N2 ((nod << 1) + 1)
  115.  
  116. void make_arb (int nod, int st, int dr) {
  117.  
  118.     for (int i = st; i <= dr; i++) {
  119.         insert_treap (AI[nod], v[i], rand () + 1);
  120.     }
  121.  
  122.     if (st == dr)
  123.         return ;
  124.  
  125.     make_arb (N1, st, MIJ);
  126.     make_arb (N2, MIJ + 1, dr);
  127. }
  128.  
  129. void update_arb (int nod, int st, int dr) {
  130.  
  131.     if (st <= p && p <= dr) {
  132.         if (on[p] == 1) erase_treap (AI[nod], v[p]);
  133.         else insert_treap (AI[nod], v[p], rand () + 1);
  134.         return ;
  135.     }
  136.  
  137.     if (p <= MIJ) update_arb (N1, st, MIJ);
  138.     else update_arb (N2, MIJ + 1, dr);
  139. }
  140.  
  141. int query_treap (Treap *nod, int val) {
  142.  
  143.     if (nod == nil) return 0;
  144.     if (nod->key == val) return nod->left->nrfii;
  145.     if (val < nod->key) return query_treap (nod->left, val);
  146.     return query_treap (nod->right, val);
  147. }
  148.  
  149. int find_treap (Treap *nod, int val) {
  150.  
  151.     if (nod == nil) return 0;
  152.     if (nod->key == val) return 1;
  153.     if (val < nod->key) return find_treap (nod->left, val);
  154.     return find_treap (nod->right, val);
  155. }
  156.  
  157. void query_arb (int nod, int st, int dr) {
  158.  
  159.     if (p <= st && dr <= q) {
  160.         int ok = find_treap (AI[nod], val);
  161.         if (ok) IS = 1;
  162.         if (!ok) insert_treap (AI[nod], val, MAX);
  163.         if (ok) {
  164.             erase_treap (AI[nod], val);
  165.             insert_treap (AI[nod], val, MAX);
  166.         }
  167.  
  168.         rez+= query_treap (AI[nod], val);
  169.         if (!ok) erase_treap (AI[nod], val);
  170.  
  171.         if (ok) {
  172.             erase_treap (AI[nod], val);
  173.             insert_treap (AI[nod], val, rand () + 1);
  174.         }
  175.  
  176.         return ;
  177.     }
  178.  
  179.     if (p <= MIJ) query_arb (N1, st, MIJ);
  180.     if (MIJ < q) query_arb (N2, MIJ + 1, dr);
  181. }
  182.  
  183. void solve () {
  184.  
  185.     int tip, st, dr, mij, sol = 0;
  186.  
  187.     // initializare treap
  188.     nil = new Treap (0, 0, 0, NULL, NULL);
  189.  
  190.     int N = 4 * n;
  191.     for (int i = 1; i <= N; i++)
  192.         AI[i] = nil;
  193.  
  194.     make_arb (1, 1, n);
  195.  
  196.     for (; m; m--) {
  197.         scanf ("%d", &tip);
  198.         if (tip == 1) {
  199.             // update
  200.             scanf ("%d", &p);
  201.             update_arb (1, 1, n);
  202.  
  203.             if (on[p] == 1) on[p] = 0;
  204.             else on[p] = 1;
  205.         }
  206.         else {
  207.             // query
  208.             scanf ("%d %d %d", &p, &q, &k);
  209.  
  210.             st = 1; dr = n;
  211.             while (st <= dr) {
  212.                 mij = (st + dr) >> 1;
  213.                 val = s[mij]; rez = 0; IS = 0; query_arb (1, 1, n);
  214.                 if (rez + 1 == k && IS) {
  215.                     sol = v[mij];
  216.                     break ;
  217.                 }
  218.  
  219.                 if (rez + 1 <= k) st = mij + 1;
  220.                 else dr = mij - 1;
  221.  
  222.             }
  223.  
  224.             printf ("%d\n", sol);
  225.         }
  226.     }
  227. }
  228.  
  229. int main () {
  230.  
  231.     freopen ("mess.in", "r", stdin);
  232.     freopen ("mess.out", "w", stdout);
  233.  
  234.     //srand ( time (0) );
  235.     read_data ();
  236.     solve ();
  237.  
  238.     return 0;
  239. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement