Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.81 KB | None | 0 0
  1. /*
  2.  * File:   main.cpp
  3.  * Author: Morteza
  4.  *
  5.  * Created on November 4, 2010, 5:54 PM
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <math.h>
  10. int NewIndex;
  11.  
  12. class Node {
  13. public:
  14.     //Node* Parent;
  15.  
  16.     char Label;
  17.     int Depth;
  18.     Node* Parents[20];
  19.  
  20.     Node(Node* Parent, char Label) {
  21.         this->Label = Label;
  22.         if (Parent == NULL) {
  23.             Depth = 1;
  24.             for (int i = 0; i < 20; i++)
  25.                 Parents[i] = NULL;
  26.             return;
  27.         }
  28.         Parents[0] = Parent;
  29.         Depth = Parent->Depth + 1;
  30.         int i;
  31.         for (i = 1;; i++) {
  32.             Parents[i] = Parents[i - 1]->Parents[i - 1];
  33.             if (Parents[i] == NULL)
  34.                 break;
  35.         }
  36.         for (; i < 20; i++)
  37.             Parents[i] = NULL;
  38.  
  39.  
  40.     }
  41.  
  42.     Node* Find_iParent(int Index) {
  43.  
  44.         Node* iParent = this;
  45.  
  46.         int tmp = pow(2, 20);
  47.         int stp = 20;
  48.  
  49.         while (Index) {
  50.  
  51.             while (Index < tmp) {
  52.                 tmp /= 2;
  53.                 --stp;
  54.             }
  55.             iParent = iParent->Parents[stp];
  56.             Index = Index % tmp;
  57.         }
  58.  
  59.         return iParent;
  60.     }
  61.  
  62.     Node* Remove_iParent(Node* other, int size) {
  63.         if (size <= Depth)
  64.             if (Find_iParent(size - 1) == other)
  65.                 return Find_iParent(size - 2);
  66.         if (other->Parents[0])
  67.             return other->Parents[0];
  68.         return Find_iParent(Depth - 1);
  69.     }
  70.  
  71.  
  72.  
  73. };
  74.  
  75. class Strings {
  76. public:
  77.     Node* Left;
  78.     Node* Right;
  79.     int Size;
  80.  
  81.     Strings() {
  82.         Left = NULL;
  83.         Right = NULL;
  84.         Size = 0;
  85.     }
  86.  
  87. };
  88.  
  89.  
  90. Strings Data[1000001];
  91.  
  92. void AddRight(int Index, char Label) {
  93.  
  94.     if (Data[Index].Size == 0) {
  95.         Data[NewIndex].Right = Data[NewIndex].Left = new Node(NULL, Label);
  96.         Data[NewIndex].Size = 1;
  97.         return;
  98.     }
  99.  
  100.     Data[NewIndex].Right = new Node(Data[Index].Right, Label);
  101.     Data[NewIndex].Left = Data[Index].Left;
  102.     Data[NewIndex].Size = Data[Index].Size + 1;
  103.  
  104. }
  105.  
  106. void AddLeft(int Index, char Label) {
  107.  
  108.     if (Data[Index].Size == 0) {
  109.         Data[NewIndex].Left = Data[NewIndex].Right = new Node(NULL, Label);
  110.         Data[NewIndex].Size = 1;
  111.         return;
  112.     }
  113.  
  114.     Data[NewIndex].Left = new Node(Data[Index].Left, Label);
  115.     Data[NewIndex].Right = Data[Index].Right;
  116.     Data[NewIndex].Size = Data[Index].Size + 1;
  117. }
  118.  
  119. void RemoveRight(int Index) {
  120.  
  121.     if (Data[Index].Size == 1) {
  122.         Data[NewIndex].Right = NULL;
  123.         Data[NewIndex].Left = NULL;
  124.         Data[NewIndex].Size = 0;
  125.         return;
  126.     }
  127.  
  128. //    Data[NewIndex].Right = Data[Index].Left->Remove_iParent(Data[Index].Right, Data[Index].Size);
  129. //    Node * Remove_iParent(Node* other, int size) {
  130. //        if (size <= Depth)
  131. //            if (Find_iParent(size - 1) == other)
  132. //                return Find_iParent(size - 2);
  133. //        if (other->Parents[0])
  134. //            return other->Parents[0];
  135. //        return Find_iParent(Depth - 1);
  136. //    }
  137.  
  138.     if (Data[Index].Size <= Data[Index].Left->Depth)
  139.        
  140.         if (Data[Index].Left->Find_iParent(Data[Index].Size - 1) == Data[Index].Right)
  141.            
  142.             Data[NewIndex].Right = Data[Index].Left->Find_iParent(Data[Index].Size - 2);
  143.    
  144.     if (Data[Index].Right->Parents[0])
  145.    
  146.         Data[NewIndex].Right = Data[Index].Right->Parents[0];
  147.    
  148.     Data[NewIndex].Right = Data[Index].Left->Find_iParent(Data[Index].Left->Depth - 1);
  149.  
  150.  
  151.  
  152.  
  153.     Data[NewIndex].Left = Data[Index].Left;
  154.     Data[NewIndex].Size = Data[Index].Size - 1;
  155. }
  156.  
  157. void RemoveLeft(int Index) {
  158.  
  159.     if (Data[Index].Size == 1) {
  160.         Data[NewIndex].Left = NULL;
  161.         Data[NewIndex].Right = NULL;
  162.         Data[NewIndex].Size = 0;
  163.         return;
  164.     }
  165.  
  166.     Data[NewIndex].Left = Data[Index].Right->Remove_iParent(Data[Index].Left, Data[Index].Size);
  167.     Data[NewIndex].Right = Data[Index].Right;
  168.     Data[NewIndex].Size = Data[Index].Size - 1;
  169. }
  170.  
  171. int main() {
  172.  
  173.     int Index;
  174.     char Label;
  175.  
  176.     int n;
  177.     scanf("%d", &n);
  178.  
  179.     char *command = new char[20];
  180.  
  181.     for (int i = 0; i < n; i++) {
  182.  
  183.         ++NewIndex;
  184.  
  185.         scanf("%s", command);
  186.  
  187.         if (command[6] == 'T') {
  188.             scanf("%d %c", &Index, &Label);
  189.             AddLeft(Index, Label);
  190.         } else if (command[6] == 'H') {
  191.             scanf("%d %c", &Index, &Label);
  192.             AddRight(Index, Label);
  193.         } else if (command[6] == 'L') {
  194.             scanf("%d", &Index);
  195.             RemoveLeft(Index);
  196.         } else if (command[6] == 'R') {
  197.             scanf("%d", &Index);
  198.             RemoveRight(Index);
  199.         }
  200.         if (Data[NewIndex].Size != 0)
  201.             printf("%c %c\n", Data[NewIndex].Left->Label, Data[NewIndex].Right->Label);
  202.         else
  203.             printf("empty\n");
  204.     }
  205.     return 0;
  206. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement