Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2014
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.01 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. struct AVLNode
  7. {
  8.     AVLNode * up;
  9.     AVLNode * left;
  10.     AVLNode * right;
  11.     int key;
  12.     long long data;
  13.     int bf;
  14.     int nulls;
  15. };
  16.  
  17. // Rotacja RR
  18. //-----------
  19. void RR(AVLNode * & root, AVLNode * A)
  20. {
  21.     AVLNode * B = A->right, * p = A->up;
  22.  
  23.     A->nulls -= B->nulls;
  24.     if(B->left) A->nulls += B->left->nulls;
  25.     else A->nulls++;
  26.  
  27.     if(A->left) B->nulls += A->left->nulls;
  28.     else B->nulls++;
  29.  
  30.     A->right = B->left;
  31.     if(A->right) A->right->up = A;
  32.  
  33.     B->left = A;
  34.     B->up = p;
  35.     A->up = B;
  36.  
  37.     if(p)
  38.     {
  39.         if(p->left == A) p->left = B;
  40.         else p->right = B;
  41.     }
  42.     else root = B;
  43.  
  44.     if(B->bf == -1) A->bf = B->bf = 0;
  45.     else
  46.     {
  47.         A->bf = -1;
  48.         B->bf = 1;
  49.     }
  50. }
  51.  
  52. // Rotacja LL
  53. //-----------
  54. void LL(AVLNode * & root, AVLNode * A)
  55. {
  56.     AVLNode * B = A->left, * p = A->up;
  57.  
  58.     A->nulls -= B->nulls;
  59.     if(B->right) A->nulls += B->right->nulls;
  60.     else A->nulls++;
  61.  
  62.     if(A->right)B->nulls += A->right->nulls;
  63.     else B->nulls++;
  64.  
  65.  
  66.     A->left = B->right;
  67.     if(A->left) A->left->up = A;
  68.  
  69.     B->right = A;
  70.     B->up = p;
  71.     A->up = B;
  72.  
  73.     if(p)
  74.     {
  75.         if(p->left == A) p->left = B;
  76.         else p->right = B;
  77.     }
  78.     else root = B;
  79.  
  80.     if(B->bf == 1) A->bf = B->bf = 0;
  81.     else
  82.     {
  83.         A->bf = 1;
  84.         B->bf = -1;
  85.     }
  86. }
  87.  
  88. // Rotacja RL
  89. //-----------
  90. void RL(AVLNode * & root, AVLNode * A)
  91. {
  92.     AVLNode * B = A->right, * C = B->left, * p  = A->up;
  93.  
  94.     B->nulls -= C->nulls;
  95.     if(C->right) B->nulls += C->right->nulls;
  96.     else B->nulls++;
  97.  
  98.     if(B->right)C->nulls += B->right->nulls;
  99.     else C->nulls++;
  100.  
  101.     A->nulls -= C->nulls;
  102.     if(C->left) A->nulls += C->left->nulls;
  103.     else A->nulls++;
  104.  
  105.     if(A->left) C->nulls += A->left->nulls;
  106.     else C->nulls++;
  107.  
  108.  
  109.  
  110.  
  111.     B->left = C->right;
  112.     if(B->left) B->left->up = B;
  113.  
  114.     A->right = C->left;
  115.     if(A->right) A->right->up = A;
  116.  
  117.     C->left = A;
  118.     C->right = B;
  119.     A->up = B->up = C;
  120.     C->up = p;
  121.  
  122.     if(p)
  123.     {
  124.         if(p->left == A) p->left = C;
  125.         else p->right = C;
  126.     }
  127.     else root = C;
  128.  
  129.     if(C->bf == -1) A->bf =  1;
  130.     else A->bf = 0;
  131.     if(C->bf ==  1) B->bf = -1;
  132.     else B->bf = 0;
  133.  
  134.     C->bf = 0;
  135. }
  136.  
  137. // Rotacja LR
  138. //-----------
  139. void LR(AVLNode * & root, AVLNode * A)
  140. {
  141.     AVLNode * B = A->left, * C = B->right, * p = A->up;
  142.  
  143.     B->nulls -= C->nulls;
  144.     if(C->left) B->nulls += C->left->nulls;
  145.     else B->nulls++;
  146.  
  147.     if(B->left) C->nulls += B->left->nulls;
  148.     else C->nulls++;
  149.  
  150.     A->nulls -= C->nulls;
  151.     if(C->right) A->nulls += C->right->nulls;
  152.     else A->nulls++;
  153.  
  154.     if(A->right)C->nulls += A->right->nulls;
  155.     else C->nulls++;
  156.  
  157.     B->right = C->left;
  158.     if(B->right) B->right->up = B;
  159.  
  160.     A->left = C->right;
  161.     if(A->left) A->left->up = A;
  162.  
  163.     C->right = A;
  164.     C->left = B;
  165.     A->up = B->up = C;
  166.     C->up = p;
  167.  
  168.     if(p)
  169.     {
  170.         if(p->left == A) p->left = C;
  171.         else p->right = C;
  172.     }
  173.     else root = C;
  174.  
  175.     if(C->bf ==  1) A->bf = -1;
  176.     else A->bf = 0;
  177.     if(C->bf == -1) B->bf =  1;
  178.     else B->bf = 0;
  179.  
  180.     C->bf = 0;
  181. }
  182.  
  183. void insertAVL(AVLNode * & root, int k, long long d)
  184. {
  185.     AVLNode * w,* p,* r;
  186.     bool t;
  187.  
  188.     w = new AVLNode;        // tworzymy dynamicznie nowy węzeł
  189.     w->left = w->right = w->up = NULL;
  190.     w->key  = k;
  191.     w->bf  = 0;
  192.     w->data = d;
  193.     w->nulls = 2;
  194.  
  195.     //----------------------------------------
  196.     // FAZA 1 - wstawienie węzła do drzewa AVL
  197.     //----------------------------------------
  198.  
  199.     p = root;              // rozpoczynamy od korzenia
  200.  
  201.     if(!p)
  202.     {
  203.         root = w;
  204.     }       // jeśli drzewo jest puste, to węzeł w umieszczamy w korzeniu
  205.     else
  206.     {
  207.         // inaczej szukamy miejsce dla w
  208.         while(true)
  209.         {
  210.             p->nulls++;
  211.             if(k < p->key)     // porównujemy klucze
  212.             {
  213.                 if(!p->left)     // jeśli p nie posiada lewego syna, to
  214.                 {
  215.                     p->left = w;   // lewym synem p staje się węzeł w
  216.                     break;         // wychodzimy z pętli
  217.                 }
  218.                 p = p->left;     // inaczej przechodzimy do lewego syna
  219.             }
  220.             else
  221.             {
  222.                 if(!p->right)    // jeśli p nie posiada prawego syna, to
  223.                 {
  224.                     p->right = w;  // prawym synem staje się węzeł w
  225.                     break;         // wychodzimy z pętli
  226.                 }
  227.                 p = p->right;    // inaczej przechodzimy do prawego syna
  228.             }
  229.         }
  230.         w->up = p; // ojcem w jest p
  231.  
  232.         //---------------------------------
  233.         // FAZA 2 - równoważenie drzewa AVL
  234.         //---------------------------------
  235.  
  236.         if(p->bf)
  237.         {
  238.             p->bf = 0; // UWAGA NR 1
  239.         }
  240.         else
  241.         {
  242.             if(p->left == w)   // UWAGA NR 2
  243.                 p->bf = 1;
  244.             else
  245.                 p->bf = -1;
  246.  
  247.             r = p->up;        // będziemy szli w górę drzewa w kierunku korzenia
  248.             // r i p wskazują ojca i syna na tej ścieżce
  249.             t = false;
  250.             while(r)
  251.             {
  252.                 if(r->bf)
  253.                 {
  254.                     t = true;     // ustalamy wynik pętli
  255.                     break;        // przerywamy pętlę
  256.                 };
  257.                 // inaczej modyfikujemy r.bf
  258.                 if(r->left == p) r->bf =  1;
  259.                 else             r->bf = -1;
  260.                 p = r;          // przechodzimy w górę na wyższy poziom
  261.                 r = r->up;
  262.             }
  263.  
  264.             if(t)             // jeśli r.bf = +/- 1, to musimy
  265.             {
  266.                 // równoważyć drzewo
  267.                 if(r->bf == 1)
  268.                 {
  269.                     if(r->right == p) r->bf = 0;  // gałęzie się równoważą
  270.                     else if(p->bf == -1) LR(root,r);
  271.                     else                 LL(root,r);
  272.                 }
  273.                 else
  274.                 {
  275.                     // r.bf = -1
  276.                     if(r->left == p) r->bf = 0;  // gałęzie się równoważą
  277.                     else if(p->bf == 1) RL(root,r);
  278.                     else                RR(root,r);
  279.  
  280.                 }
  281.             }
  282.         }
  283.     }
  284. }
  285.  
  286. AVLNode * findAVL(AVLNode * p, int nr)
  287. {
  288.     nr++;
  289.     while(p)
  290.     {
  291.         if(nr < 0 || nr > p->nulls) return NULL;
  292.         else if(!p->left)
  293.         {
  294.             if(nr == 1) return p;
  295.             else if(nr > 1)
  296.             {
  297.                 nr--;
  298.                 p = p->right;
  299.             }
  300.         }
  301.         else if(nr < p->left->nulls) p = p->left;
  302.         else if(nr == p->left->nulls) return p;
  303.         else if(nr > p->left->nulls)
  304.         {
  305.             nr -= p->left->nulls;
  306.             p = p->right;
  307.         }
  308.     }
  309.  
  310.     return NULL;
  311. }
  312.  
  313. void DFSRelease(AVLNode * v)
  314. {
  315.     if(v)
  316.     {
  317.         DFSRelease(v->left);   // usuwamy lewe poddrzewo
  318.         DFSRelease(v->right);  // usuwamy prawe poddrzewo
  319.         delete v;              // usuwamy sam węzeł
  320.     }
  321. }
  322.  
  323. AVLNode * predAVL(AVLNode * p)
  324. {
  325.     AVLNode * r;
  326.  
  327.     if(p)
  328.     {
  329.         if(p->left)
  330.         {
  331.             p = p->left;
  332.             while(p->right) p = p->right;
  333.         }
  334.         else
  335.             do
  336.             {
  337.                 r = p;
  338.                 p = p->up;
  339.             }
  340.             while(p && p->right != r);
  341.     }
  342.     return p;
  343. }
  344.  
  345. AVLNode * removeAVL(AVLNode * & root, AVLNode * x)
  346. {
  347.     AVLNode  *t,*y,*z, *tmp;
  348.     bool nest;
  349.  
  350.     if(x->left && x->right)
  351.     {
  352.         y    = removeAVL(root,predAVL(x));
  353.         y->nulls = x->nulls;
  354.         nest = false;
  355.     }
  356.     else
  357.     {
  358.         if(x->left)
  359.         {
  360.             y = x->left;
  361.             x->left = NULL;
  362.         }
  363.         else
  364.         {
  365.             y = x->right;
  366.             x->right = NULL;
  367.         }
  368.         x->bf = 0;
  369.         nest  = true;
  370.     }
  371.  
  372.     if(y)
  373.     {
  374.         y->up    = x->up;
  375.         y->left  = x->left;
  376.         if(y->left)  y->left->up  = y;
  377.         y->right = x->right;
  378.         if(y->right)  y->right->up = y;
  379.         y->bf    = x->bf;
  380.     }
  381.  
  382.     if(x->up)
  383.     {
  384.         if(x->up->left == x) x->up->left = y;
  385.         else x->up->right = y;
  386.     }
  387.     else root = y;
  388.  
  389.  
  390.     if(nest)
  391.     {
  392.         z = y;
  393.         y = x->up;
  394.         tmp = y;
  395.         while(tmp)
  396.         {
  397.             tmp->nulls--;
  398.             tmp = tmp->up;
  399.         }
  400.  
  401.         while(y)
  402.         {
  403.             if(!y->bf)
  404.             {
  405.                 // Przypadek nr 1
  406.                 if(y->left == z)  y->bf = -1;
  407.                 else y->bf = 1;
  408.                 break;
  409.             }
  410.             else
  411.             {
  412.                 if(((y->bf == 1) && (y->left == z)) || ((y->bf == -1) && (y->right == z)))
  413.                 {
  414.                     // Przypadek nr 2
  415.                     y->bf = 0;
  416.                     z = y;
  417.                     y = y->up;
  418.                 }
  419.                 else
  420.                 {
  421.                     if(y->left == z)  t = y->right;
  422.                     else t = y->left;
  423.                     if(!t->bf)
  424.                     {
  425.                         // Przypadek 3A
  426.                         if(y->bf == 1) LL(root,y);
  427.                         else RR(root,y);
  428.                         break;
  429.                     }
  430.                     else if(y->bf == t->bf)
  431.                     {
  432.                         // Przypadek 3B
  433.                         if(y->bf == 1) LL(root,y);
  434.                         else RR(root,y);
  435.                         z = t;
  436.                         y = t->up;
  437.                     }
  438.                     else
  439.                     {
  440.                         // Przypadek 3C
  441.                         if(y->bf == 1) LR(root,y);
  442.                         else RL(root,y);
  443.                         z = y->up;
  444.                         y = z->up;
  445.                     }
  446.                 }
  447.             }
  448.         }
  449.     }
  450.     return x;
  451. }
  452.  
  453. inline int readLong(long long *n)
  454. {
  455.     register int c = getc_unlocked(stdin);
  456.     if(c != EOF)
  457.     {
  458.         (*n) = 0LL;
  459.         while (c > 47)
  460.         {
  461.  
  462.             (*n)=(*n)*10LL + (c-'0');
  463.             c = getc_unlocked(stdin);
  464.         }
  465.     }
  466.     return c;
  467. }
  468.  
  469. inline int readInt(int *n)
  470. {
  471.     register int c = getc_unlocked(stdin);
  472.     if(c != EOF)
  473.     {
  474.         (*n) = 0;
  475.         while (c > 47)
  476.         {
  477.  
  478.             (*n)=(*n)*10 + (c-'0');
  479.             c = getc_unlocked(stdin);
  480.         }
  481.     }
  482.     return c;
  483. }
  484.  
  485.  
  486.  
  487. int main()
  488. {
  489.     AVLNode *POS, *root = NULL, *help;
  490.     register int size = 0, i, t;
  491.     long long current, posData, nr = 0LL;
  492.     readInt(&t);
  493.  
  494.     for(i = 0 ; readLong(&current) != EOF; i++)
  495.     {
  496.         insertAVL(root, i, current);
  497.         size++;
  498.     }
  499.  
  500.     if(size == 0)
  501.     {
  502.         printf("-1");
  503.         return 0;
  504.     }
  505.  
  506.  
  507.     POS = findAVL(root, 0);
  508.     for(i = t; i > 0; i--)
  509.     {
  510.         //cout << " nr: " << nr << " data: " << POS->data << endl;
  511.  
  512.         if(POS->data % 2 == 0)
  513.         {
  514.             //cout << "usuwam: "<<endl;
  515.             help = findAVL(root, (nr + 1) % size);
  516.             posData = help->data;
  517.             removeAVL(root, help);
  518.             size--;
  519.             if(nr == size) nr--;
  520.  
  521.             if(size == 0)
  522.             {
  523.                 printf("-1");
  524.                 return 0;
  525.             }
  526.         }
  527.         else
  528.         {
  529.             // cout << "dodaje: " << nr+1 << endl;
  530.             posData = POS->data;
  531.             insertAVL(root, nr, POS->data - 1);
  532.             size++;
  533.         }
  534.         //cout << nr << " + " << posData << " % " << size << " = " << (nr + posData)%size << endl;
  535.         nr = (nr + posData)%size;
  536.         POS = findAVL(root, nr);
  537.         //printBT("", "", root);
  538.     }
  539.  
  540.  
  541.     for(i = 0, t = nr; i < size; i++, t = ((t + 1)%size))
  542.     {
  543.         printf("%lld ", findAVL(root, t)->data);
  544.     }
  545.  
  546.     //DFSRelease(root);
  547.  
  548. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement