Advertisement
Guest User

Untitled

a guest
Apr 20th, 2018
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.25 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <mem.h>
  3. #define MAX 6000
  4. typedef struct Participant{
  5.     int number;
  6.     int points;
  7.     int date;
  8. }t_Participant;
  9. t_Participant HEAP[MAX];
  10. int n, date = 0;
  11.  
  12. void swap(int a, int b){
  13.     t_Participant buf;
  14.     buf = HEAP[a];
  15.     HEAP[a] = HEAP[b];
  16.     HEAP[b] = buf;
  17. }
  18.  
  19. int comp(int large, int little){
  20.     if(HEAP[large].points < HEAP[little].points){
  21.         large = little;
  22.     }else if(HEAP[large].points == HEAP[little].points){
  23.         if(HEAP[large].date < HEAP[little].date) {
  24.             large = little;
  25.         }
  26.     }
  27.     return large;
  28. }
  29.  
  30. void comparator(int large, int little){
  31.     if(HEAP[large].points < HEAP[little].points){
  32.         swap(large,little);
  33.     }else if(HEAP[large].points == HEAP[little].points){
  34.         if(HEAP[large].date < HEAP[little].date) {
  35.             swap(large, little);
  36.         }
  37.     }
  38. }
  39.  
  40. void pr(FILE *out, int WINNERS[3],int place){
  41.     fprintf(out,"%d ", place);
  42.     for (int i = 0; i < place; ++i) {
  43.         fprintf(out,"%d ", WINNERS[i]);
  44.     }
  45.     fprintf(out,"\n");
  46. }
  47.  
  48. void printRES(FILE *out){
  49.     if(HEAP[0].points == 0){
  50.         fprintf(out, "%d\n", 0);
  51.         return;
  52.     }
  53.     int WINNERS[3];
  54.     memset(WINNERS,-1,3 * sizeof(int));
  55.     int place = 1, large = 0, min = 0;
  56.     WINNERS[0] = HEAP[0].number;
  57.     large = comp(1,2);
  58.     min = 3 - large;
  59.     if(HEAP[large].points != 0){
  60.         WINNERS[1] = HEAP[large].number;
  61.         ++place;
  62.     }else {
  63.         pr(out,WINNERS,place);
  64.         return;
  65.     }
  66.     large = comp(comp(2 * large + 1, 2 * large + 2), min);
  67.     if(HEAP[large].points != 0){
  68.         WINNERS[2] = HEAP[large].number;
  69.         ++place;
  70.     }else {
  71.         pr(out,WINNERS,place);
  72.         return;
  73.     }
  74.     pr(out, WINNERS, place);
  75. }
  76.  
  77. void sift_UP(int pos){
  78.     while (pos > 0 && HEAP[pos].points >= HEAP[(pos - 1) / 2].points) {
  79.         comparator((pos - 1) / 2,pos);
  80.         pos = (pos - 1) / 2;
  81.     }
  82. }
  83.  
  84. void sift_DOWN(int parent){
  85.     while (2 * parent + 1 < n) {
  86.         int left = 2 * parent + 1;
  87.         int right = 2 * parent + 2;
  88.         int largest = left;
  89.         if (right < n && HEAP[right].points > HEAP[left].points) {
  90.             comparator(right, left);
  91.             largest = right;
  92.         }
  93.         if(HEAP[parent].points > HEAP[largest].points)
  94.             break;
  95.         comparator(parent,largest);
  96.         parent = largest;
  97.     }
  98. }
  99.  
  100. int main() {
  101.     FILE *f = fopen("input.txt","r");
  102.     FILE *out = fopen("output.txt", "w");
  103.     int m;
  104.     int num, point;
  105.     fscanf(f,"%d",&n);
  106.     fscanf(f,"%d", &m);
  107.     for (int i = 0; i < n; ++i) {
  108.         HEAP[i].number = i;
  109.     }
  110.     for (int i = 0; i < m; ++i) {
  111.         fscanf(f,"%d",&num);
  112.         fscanf(f,"%d",&point);
  113.         for (int k = 0; k < n; ++k) {
  114.             if(HEAP[k].number == num){
  115.                 HEAP[k].points += point;
  116.                 if(point > 0) {
  117.                     HEAP[k].date = ++date;
  118.                     sift_UP(k);
  119.                 }else sift_DOWN(k);
  120.                 break;
  121.             }
  122.         }
  123.         printRES(out);
  124.         /*for (int j = 0; j < n; ++j) {
  125.             printf("%d[%d]{%d} ",HEAP[j].number, HEAP[j].points, HEAP[j].date);
  126.         }
  127.         printf("\n");*/
  128.  
  129.  
  130.     }
  131.     return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement