Advertisement
Guest User

Untitled

a guest
Apr 26th, 2014
448
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.04 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <string>
  7. #include <map>
  8. #include <iterator>
  9. #include <list>
  10. #include <set>
  11. #include <queue>
  12. #include <numeric>
  13. #include <cstdlib>
  14. #include <ctime>
  15. #include <climits>
  16. #include <cassert>
  17.  
  18. using namespace std;
  19.  
  20. typedef long long lli;
  21. typedef long li;
  22.  
  23. template <class T>
  24. T Maximize (T &v, T nv) { if (nv > v) v = nv; return v; }
  25.  
  26. template <class T>
  27. T Minimize (T &v, T nv) { if (nv < v) v = nv; return v; }
  28.  
  29. const lli INFLL = LONG_LONG_MAX;
  30. const li INF = LONG_MAX;
  31.  
  32. class Treap
  33. {
  34.     static const li N = (li)3e5 + 1;
  35.  
  36.     struct Node
  37.     {
  38.         li pr, size, v;
  39.         Node *l, *r;
  40.  
  41.         Node (li pr, li v) : pr(pr), v(v), l(0), r(0), size(1) {}
  42.  
  43.         void Update ()
  44.         {
  45.             size = SizeOf(l) + SizeOf(r) + 1;
  46.         }
  47.  
  48.         void Print ()
  49.         {
  50.             printf("%ld", v);
  51.         }
  52.  
  53.         li Index ()
  54.         {
  55.             return SizeOf(l) + 1;
  56.         }
  57.  
  58.         inline static li SizeOf (Node *v)
  59.         {
  60.             return v ? v->size : 0;
  61.         }
  62.  
  63.         static void Update (Node *v)
  64.         {
  65.             if (!v) return;
  66.             v->Update();
  67.         }
  68.  
  69.         static void Print (Node *v)
  70.         {
  71.             if (!v) return;
  72.             Print(v->l);
  73.             v->Print(), printf(" ");
  74.             Print(v->r);
  75.         }
  76.     };
  77.  
  78.     private:
  79.         Node *root;
  80.         li prs[N], nodes;
  81.  
  82.         void merge (Node *l, Node *r, Node *&v)
  83.         {
  84.             if (!l || !r) return void(v = l ? l : r);
  85.  
  86.             if (l->pr > r->pr)
  87.             {
  88.                 v = l;
  89.                 merge(l->r, r, v->r);
  90.             }
  91.             else
  92.             {
  93.                 v = r;
  94.                 merge(l, r->l, v->l);
  95.             }
  96.             Node::Update(v);
  97.         }
  98.  
  99.         void split (Node *v, li x, Node *&l, Node *&r)
  100.         {
  101.             if (!v) return void(l = r = 0);
  102.  
  103.             li key = v->Index();
  104.             if (key <= x)
  105.             {
  106.                 l = v;
  107.                 split(v->r, x - key, l->r, r);
  108.                 Node::Update(l);
  109.             }
  110.             else
  111.             {
  112.                 r = v;
  113.                 split(v->l, x, l, r->l);
  114.                 Node::Update(r);
  115.             }
  116.         }
  117.  
  118.         void insert (Node *&r, Node *v, li x)
  119.         {
  120.             if (!r) return void(r = v);
  121.             li pos = r->Index();
  122.             if (v->pr > r->pr) split(r, x - 1, v->l, v->r), r = v;
  123.             else if (x <= pos) insert(r->l, v, x);
  124.             else insert(r->r, v, pos - x + 2);
  125.             Node::Update(r);
  126.         }
  127.  
  128.         void insert (Node *v, li x)
  129.         {
  130.             Node *l = 0, *r = 0;
  131.             split(root, x - 1, l, r);
  132.             merge(l, v, l);
  133.             merge(l, r, root);
  134.         }
  135.  
  136.         void erase (Node *&v, li x)
  137.         {
  138.             li pos = v->Index();
  139.             if (pos == x) merge(v->l, v->r, v);
  140.             else if (x < pos) erase(v->l, x);
  141.             else erase(v->r, x - pos);
  142.             Node::Update(v);
  143.         }
  144.  
  145.         void generatePriorities ()
  146.         {
  147.             for (li i = 0; i < N; ++ i)
  148.             {
  149.                 prs[i] = i;
  150.             }
  151.             random_shuffle(prs, prs + N);
  152.         }
  153.     public:
  154.         Treap () : root(0), nodes(0)
  155.         {
  156.             generatePriorities();
  157.         }
  158.  
  159.         void Insert (li v, li x)
  160.         {
  161.             //insert(root, NewNode(v), x);
  162.             insert(NewNode(v), x);
  163.         }
  164.  
  165.         void Erase (li x)
  166.         {
  167.             erase(root, x);
  168.             /*Node *l = 0, *m = 0, *r = 0;
  169.             split(root, x - 1, l, r);
  170.             split(r, 1, m, r);
  171.             assert(m);
  172.             merge(l, r, root);*/
  173.         }
  174.  
  175.         void Print ()
  176.         {
  177.             Node::Print(root);
  178.         }
  179.  
  180.         void Print (li from, li to)
  181.         {
  182.             Node *l = 0, *m = 0, *r = 0;
  183.             split(root, from - 1, l, r);
  184.             split(r, to - from, m, r);
  185.             Node::Print(m);
  186.             merge(l, m, l);
  187.             merge(l, r, root);
  188.         }
  189.  
  190.         Node* NewNode (li v)
  191.         {
  192.             return new Node(prs[nodes++], v);
  193.         }
  194. };
  195.  
  196. void solve ()
  197. {
  198.     li n, m;
  199.     scanf("%ld %ld", &n, &m);
  200.  
  201.     srand(time(0));
  202.  
  203.     Treap *t = new Treap();
  204.     set <li> zeros;
  205.     for (li i = 1; i <= m; ++ i)
  206.     {
  207.         t->Insert(0, i);
  208.         zeros.insert(i);
  209.     }
  210.  
  211.     li maxpos = 0;
  212.     for (li i = 1; i <= n; ++ i)
  213.     {
  214.         li pos;
  215.         scanf("%ld", &pos);
  216.         set<li>::iterator it = zeros.lower_bound(pos);
  217.         if (it == zeros.end() || *it > maxpos)
  218.         {
  219.             maxpos ++;
  220.         }
  221.         if (it != zeros.end())
  222.         {
  223.             //printf("Delete zero at %ld\n", *it);
  224.             t->Erase(*it);
  225.             zeros.erase(it);
  226.         }
  227.  
  228.         Maximize(maxpos, pos);
  229.  
  230.         //printf("%ld\n", maxpos);
  231.  
  232.         t->Insert(i, pos);
  233.         //t->Print();
  234.         //printf("\n");
  235.     }
  236.  
  237.     printf("%ld\n", maxpos);
  238.     t->Print(1, maxpos + 1);
  239. }
  240.  
  241. void init ()
  242. {
  243.     freopen("key.in", "r", stdin);
  244.     freopen("key.out", "w", stdout);
  245. }
  246.  
  247. int main()
  248. {
  249.     init();
  250.     solve();
  251.     return 0;
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement