Advertisement
Guest User

Untitled

a guest
May 26th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.70 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <mem.h>
  4.  
  5. //#define DEBUG TRUE
  6.  
  7. #ifdef DEBUG
  8. #define INPUT_FILE "C:\\Users\\Maksim Ignatyev\\CLionProjects\\AaDS\\taskC\\input.txt"
  9. #define OUTPUT_FILE "C:\\Users\\Maksim Ignatyev\\CLionProjects\\AaDS\\taskC\\output.txt"
  10. #else
  11. #define INPUT_FILE "input.txt"
  12. #define OUTPUT_FILE "output.txt"
  13. #endif
  14.  
  15. typedef struct{
  16.     int balls;
  17.     int num;
  18.     int time;
  19. } t_member;
  20.  
  21. int member_comparator(t_member*, t_member*);
  22.  
  23. void heap_push(t_member);
  24. void heap_sift_up(int);
  25. void heap_sift_down(int);
  26. t_member heap_extract_max();
  27.  
  28. int heap_size = 0;
  29.  
  30. t_member heap[100000];
  31. int helper[100000];
  32.  
  33. const t_member null_member = {-1, -1, -1};
  34.  
  35. int main(){
  36.  
  37.     int n, m;
  38.     FILE* ifile = fopen(INPUT_FILE, "r");
  39.     FILE* ofile = fopen(OUTPUT_FILE, "a+");
  40.     fscanf(ifile, "%d %d", &n, &m);
  41.     t_member member;
  42.     //memset(helper, -1, 200000);
  43.     for(int i = 0; i < n; i++) helper[i] = -1;
  44.     int m_num;
  45.     int m_balls;
  46.     for(int i = 0; i < m; i++){
  47.         fscanf(ifile, "%d %d", &m_num, &m_balls);
  48.         t_member temp[3] = {null_member, null_member, null_member};
  49.         if(helper[m_num] == -1){
  50.             member.num = m_num;
  51.             member.balls = m_balls;
  52.             member.time = i;
  53.             heap_push(member);
  54.         }else{
  55.             heap[helper[m_num]].balls += m_balls;
  56.  
  57.             void (*heap_sift)(int);
  58.             if(m_balls > 0){
  59.                 heap[helper[m_num]].time = i;
  60.                 heap_sift = &heap_sift_up;
  61.             }
  62.             if(m_balls < 0) heap_sift = &heap_sift_down;
  63.             heap_sift(helper[m_num]);
  64.         }
  65.         int k = heap_size < 3 ? heap_size : 3;
  66.         int c = 0;
  67.         for(int j = 0; j < k; j++){
  68.             temp[j] = heap_extract_max();
  69.             if(temp[j].balls > 0) c++;
  70.         }
  71.         for(int j = 0; j < k; j++){
  72.             heap_push(temp[j]);
  73.         }
  74.         fprintf(ofile, "%d ", c);
  75.         for(int j = 0; j < c; j++){
  76.             //if(temp[j].num == -1) break;
  77.             fprintf(ofile, "%d ", temp[j].num);
  78.             temp[j] = null_member;
  79.         }
  80.         fprintf(ofile, "\n");
  81.     }
  82.     fclose(ifile);
  83.     fclose(ofile);
  84. }
  85.  
  86. void heap_push(t_member member){
  87.     heap_size++;
  88.     heap[heap_size - 1] = member;
  89.     helper[member.num] = heap_size - 1;
  90.     heap_sift_up(heap_size - 1);
  91. }
  92.  
  93. void heap_sift_up(int i){
  94.  
  95.     if(heap_size == 1)
  96.         return;
  97.  
  98.     while(member_comparator(&heap[i], &heap[(i - 1) / 2]) == 1){
  99.  
  100.         helper[heap[i].num] = (i - 1) / 2;
  101.         helper[heap[(i - 1) / 2].num] = i;
  102.  
  103.         t_member t = heap[i];
  104.         heap[i] = heap[(i - 1) / 2];
  105.         heap[(i - 1) / 2] = t;
  106.  
  107.         i = (i - 1) / 2;
  108.     }
  109.  
  110. }
  111.  
  112. void heap_sift_down(int i){
  113.     while(1){
  114.         int left = 2 * i + 1;
  115.         int right = 2 * i + 2;
  116.  
  117.         if(left >= heap_size) return;
  118.  
  119.         int k = left;
  120.  
  121.         if(right < heap_size && member_comparator(&heap[right], &heap[k]) == 1)
  122.             k = right;
  123.  
  124.         if(member_comparator(&heap[k], &heap[i]) == -1)
  125.             return;
  126.  
  127.         helper[heap[i].num] = k;
  128.         helper[heap[k].num] = i;
  129.  
  130.         t_member t = heap[i];
  131.         heap[i] = heap[k];
  132.         heap[k] = t;
  133.  
  134.         i = k;
  135.     }
  136. }
  137.  
  138. t_member heap_extract_max(){
  139.     t_member max = heap[0];
  140.     heap[0] = heap[heap_size - 1];
  141.     heap_size--;
  142.     heap_sift_down(0);
  143.     return max;
  144. }
  145.  
  146. int member_comparator(t_member* a, t_member* b){
  147.     if(a->balls > b->balls) return 1;
  148.     if(a->balls == b->balls){
  149.         if(a->time > b->time) return 1;
  150.         if(a->time == b->time) return 0;
  151.         if(a->time < b->time) return -1;
  152.     }
  153.     if(a->balls < b->balls) return -1;
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement