mbah_bejo

BOP

Mar 5th, 2020
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.00 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdbool.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. int arrmax[1000001];
  7. int agebaby_list[1000001];
  8.  
  9. typedef struct dnode_t {
  10.     int data;
  11.     struct dnode_t      \
  12.         *next,
  13.         *prev;
  14. } DListNode, *DListNodePtr;
  15.  
  16. typedef struct deque_t {
  17.     DListNodePtr _head, _tail;
  18.     unsigned _size;
  19. } Deque, *DequePtr;
  20.  
  21. DListNodePtr __dlist_createNode(int value)
  22. {
  23.     DListNodePtr newNode = (DListNodePtr) malloc (sizeof(DListNode));
  24.    
  25.     if (!newNode) return NULL;
  26.     newNode->data = value;
  27.     newNode->next = NULL;
  28.     newNode->prev = NULL;
  29.  
  30.     return (DListNodePtr) newNode;
  31. }
  32.  
  33. void deq_init(DequePtr deque)
  34. {
  35.     deque->_head = NULL;
  36.     deque->_tail = NULL;
  37.     deque->_size = (unsigned) 0;
  38. }
  39.  
  40. bool deq_isEmpty(DequePtr deque) {
  41.     return (deque->_head == NULL && deque->_tail == NULL);
  42. }
  43.  
  44. void deq_pushFront(DequePtr deque, int value)
  45. {
  46.     DListNodePtr newNode = __dlist_createNode(value);
  47.     if (newNode) {
  48.         deque->_size++;
  49.         if (deq_isEmpty(deque)) {
  50.             deque->_head = newNode;
  51.             deque->_tail = newNode;
  52.             return;
  53.         }
  54.  
  55.         newNode->next = deque->_head;
  56.         deque->_head->prev = newNode;
  57.         deque->_head = newNode;
  58.     }
  59. }
  60.  
  61. DListNodePtr deq_pushBack(DequePtr deque, int value)
  62. {
  63.     DListNodePtr newNode = __dlist_createNode(value);
  64.     if (newNode) {
  65.         deque->_size++;
  66.         if (deq_isEmpty(deque)) {
  67.             deque->_head = newNode;
  68.             deque->_tail = newNode;
  69.             return newNode;
  70.         }
  71.  
  72.         deque->_tail->next = newNode;
  73.         newNode->prev = deque->_tail;
  74.         deque->_tail = newNode;
  75.         return newNode;
  76.     }
  77. }
  78.  
  79. void deq_pushAt(DequePtr deque, int value, int position)
  80. {
  81.  
  82.     if(position == 0){
  83.         deq_pushFront(deque, value);
  84.     }else if(position == deque->_size){
  85.         deq_pushBack(deque, value);
  86.     }else{
  87.         DListNodePtr newNode = __dlist_createNode(value);
  88.         DListNodePtr temp = deque->_head;
  89.         if (newNode) {
  90.             position--;
  91.             while(position--){
  92.                 temp=temp->next;
  93.                 if(temp == NULL){
  94.                     printf("Error : position out of range!\n");
  95.                     return;
  96.                 }
  97.             }
  98.  
  99.             newNode->prev = temp;
  100.             newNode->next = temp->next;
  101.            
  102.             newNode->next->prev = newNode;
  103.             temp->next=newNode;
  104.            
  105.             deque->_size++;
  106.         }
  107.     }
  108. }
  109.  
  110. int deq_front(DequePtr deque) {
  111.     if (!deq_isEmpty(deque)) {
  112.         return (deque->_head->data);
  113.     }
  114.     return 0;
  115. }
  116.  
  117. int deq_back(DequePtr deque) {
  118.     if (!deq_isEmpty(deque)) {
  119.         return (deque->_tail->data);
  120.     }
  121.     return 0;
  122. }
  123.  
  124. void deq_popFront(DequePtr deque)
  125. {
  126.     if (!deq_isEmpty(deque)) {
  127.         DListNodePtr temp = deque->_head;
  128.         if (deque->_head == deque->_tail) {
  129.             deque->_head = NULL;
  130.             deque->_tail = NULL;
  131.             free(temp);
  132.         }
  133.         else {
  134.             deque->_head = deque->_head->next;
  135.             deque->_head->prev = NULL;
  136.             free(temp);
  137.         }
  138.         deque->_size--;
  139.     }
  140. }
  141.  
  142. void deq_popBack(DequePtr deque)
  143. {
  144.     if (!deq_isEmpty(deque)) {
  145.         DListNodePtr temp;
  146.         if (deque->_head == deque->_tail) {
  147.             temp = deque->_head;
  148.             deque->_head = NULL;
  149.             deque->_tail = NULL;
  150.             free(temp);
  151.         }
  152.         else {
  153.             temp = deque->_tail;
  154.             deque->_tail = deque->_tail->prev;
  155.             deque->_tail->next = NULL;
  156.             free(temp);
  157.         }
  158.         deque->_size--;
  159.     }
  160. }
  161.  
  162. void deq_popAt(DequePtr deque, int position)
  163. {
  164.     if (!deq_isEmpty(deque)) {
  165.  
  166.         if (position == 0){
  167.             deq_popFront(deque);
  168.         }
  169.         else if(position==deque->_size-1){
  170.             deq_popBack(deque);
  171.         }else{
  172.             DListNodePtr temp;
  173.             temp = deque->_head;
  174.             while(position--){
  175.                 temp=temp->next;
  176.                 if(temp==NULL){
  177.                     printf("Error : position out of range\n");
  178.                     return;
  179.                 }
  180.             }
  181.  
  182.             temp->prev->next = temp->next;
  183.             temp->next->prev = temp->prev;
  184.             free(temp);
  185.         }
  186.  
  187.         deque->_size--;
  188.     }
  189. }
  190.  
  191. void deq_Print(DequePtr deque){
  192.     DListNodePtr temp;
  193.     temp = deque->_head;
  194.     printf("[!] Value of deque : ");
  195.     while(temp!=NULL){
  196.         printf("%d ", temp->data);
  197.         temp=temp->next;
  198.     }
  199.     printf("\n");
  200. }
  201.  
  202. void slidingWindows(int arr[], int n, int k)  
  203. {
  204.     int j, max;  
  205.     int i;
  206.     for (i = 0; i <= n - k; i++)  
  207.     {
  208.         max = arr[i];  
  209.  
  210.         for (j = 1; j < k; j++)  
  211.         {
  212.             if (arr[i + j] > max)  
  213.                 max = arr[i + j];  
  214.         }
  215.         arrmax[i] = max;
  216.     }
  217. }
  218.  
  219. typedef struct Blockt {
  220.     int value, localMax;
  221. } Block, *BlockPtr;
  222.  
  223. typedef struct Stacks{
  224.     BlockPtr S;
  225.     int size, top;
  226. }Stack,*StackPtr;
  227.  
  228. void Stack_init(StackPtr stk, int size){
  229.     // Setting size of stack and
  230.     // initial value of top
  231.     stk->size=size;
  232.     stk->S = malloc(size * sizeof(BlockPtr) );
  233.     stk->top = -1;
  234. }
  235.  
  236. void Stack_push(StackPtr stk, int value){
  237.     if(stk->top == stk->size-1){
  238.         // printf("STK is full\n");
  239.     }else{
  240.         stk->top++;
  241.         if(stk->top == 0){
  242.             stk->S[stk->top].value = value;
  243.             stk->S[stk->top].localMax = value;
  244.         }else{
  245.             if( stk->S[stk->top -1].localMax > value ){
  246.                 stk->S[stk->top].value =value;
  247.                 stk->S[stk->top].localMax = stk->S[stk->top-1].localMax;
  248.             }else{
  249.                 stk->S[stk->top].value =value;
  250.                 stk->S[stk->top].localMax =value;              
  251.             }
  252.         }
  253.         // printf("[!] Stack push : %d\n", value);
  254.     }
  255. }
  256.  
  257. void Stack_pop(StackPtr stk){
  258.     if (stk->top == -1) {
  259.         printf("Mau direfill, gan\n");
  260.     }
  261.  
  262.     else {
  263.         stk->top--;
  264.         printf("Segera Dikirim\n");
  265.     }
  266. }
  267.  
  268. void Stack_max(StackPtr stk){
  269.     if (stk->top == -1) {
  270.         printf("Mau direfill, gan\n");
  271.     }
  272.     else {
  273.         printf("%d\n", stk->S[stk->top].localMax);
  274.     }
  275. }
  276.  
  277. void Stack_top(StackPtr stk){
  278.     if (stk->top == -1) {
  279.         printf("Mau direfill, gan\n");
  280.     }
  281.     else {
  282.         printf("%d\n", stk->S[stk->top].value);
  283.     }
  284. }
  285.  
  286. void printKMax(int arr[], int n, int k)
  287. {
  288.     Deque deqQi;
  289.     deq_init(&deqQi);
  290.  
  291.     int i;
  292.     for (i = 0; i < k; ++i) {
  293.         while(!deq_isEmpty(&deqQi) && arr[i] >= arr[deq_back(&deqQi)]  ){
  294.             deq_popBack(&deqQi);
  295.         }
  296.         deq_pushBack(&deqQi,i);
  297.     }
  298.  
  299.     int counter=0;
  300.     for (; i < n; ++i) {
  301.         //printf("%d ", arr[deq_front(&deqQi)]);
  302.         arrmax[counter]=arr[deq_front(&deqQi)];        
  303.         while(!deq_isEmpty(&deqQi) && deq_front(&deqQi) <= i-k ){
  304.             deq_popFront(&deqQi);
  305.         }
  306.  
  307.         while(!deq_isEmpty(&deqQi) && arr[i] >= arr[deq_back(&deqQi)]  ){
  308.             deq_popBack(&deqQi);
  309.         }
  310.        
  311.         deq_pushBack(&deqQi, i);
  312.         counter++;
  313.     }
  314.     arrmax[counter]=arr[deq_front(&deqQi)];
  315. }
  316.  
  317. int main(int argc, char const *argv[])
  318. {
  319.     int i;
  320.     int M,N;
  321.     scanf("%d %d", &M, &N);
  322.     StackPtr stax = (StackPtr) malloc (sizeof(Stack));
  323.  
  324.     Stack_init(stax, M-N+1);
  325.    
  326.     for(i=0; i<M; i++){
  327.         scanf("%d", &agebaby_list[i]);
  328.     }
  329.  
  330.     printKMax(agebaby_list, M, N);
  331.  
  332.     int startat = 0;
  333.    
  334.     while(1){
  335.         int D;
  336.         int A;
  337.         scanf("%d %d", &D, &A);
  338.  
  339.         if(A==-1 && D ==-1){
  340.             break;
  341.         }
  342.  
  343.         int ii;
  344.         for(ii=startat; ii<D; ii++){
  345.             Stack_push(stax, arrmax[ii]);
  346.             startat++;
  347.         }
  348.  
  349.         int j;
  350.         for(j=0; j<A; j++){
  351.             int K;
  352.             scanf("%d", &K);
  353.             if(K == 1){
  354.                 Stack_pop(stax);
  355.             }else if(K == 2){
  356.                 Stack_max(stax);
  357.             }
  358.         }
  359.     }
  360.     return 0;
Add Comment
Please, Sign In to add comment