Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <mem.h>
- #define MAX 6000
- typedef struct Participant{
- int number;
- int points;
- int date;
- }t_Participant;
- t_Participant HEAP[MAX];
- int n, date = 0;
- void swap(int a, int b){
- t_Participant buf;
- buf = HEAP[a];
- HEAP[a] = HEAP[b];
- HEAP[b] = buf;
- }
- int comp(int large, int little){
- if(HEAP[large].points < HEAP[little].points){
- large = little;
- }else if(HEAP[large].points == HEAP[little].points){
- if(HEAP[large].date < HEAP[little].date) {
- large = little;
- }
- }
- return large;
- }
- void comparator(int large, int little){
- if(HEAP[large].points < HEAP[little].points){
- swap(large,little);
- }else if(HEAP[large].points == HEAP[little].points){
- if(HEAP[large].date < HEAP[little].date) {
- swap(large, little);
- }
- }
- }
- void pr(FILE *out, int WINNERS[3],int place){
- fprintf(out,"%d ", place);
- for (int i = 0; i < place; ++i) {
- fprintf(out,"%d ", WINNERS[i]);
- }
- fprintf(out,"\n");
- }
- void printRES(FILE *out){
- if(HEAP[0].points == 0){
- fprintf(out, "%d\n", 0);
- return;
- }
- int WINNERS[3];
- memset(WINNERS,-1,3 * sizeof(int));
- int place = 1, large = 0, min = 0;
- WINNERS[0] = HEAP[0].number;
- large = comp(1,2);
- min = 3 - large;
- if(HEAP[large].points != 0){
- WINNERS[1] = HEAP[large].number;
- ++place;
- }else {
- pr(out,WINNERS,place);
- return;
- }
- large = comp(comp(2 * large + 1, 2 * large + 2), min);
- if(HEAP[large].points != 0){
- WINNERS[2] = HEAP[large].number;
- ++place;
- }else {
- pr(out,WINNERS,place);
- return;
- }
- pr(out, WINNERS, place);
- }
- void sift_UP(int pos){
- while (pos > 0 && HEAP[pos].points >= HEAP[(pos - 1) / 2].points) {
- comparator((pos - 1) / 2,pos);
- pos = (pos - 1) / 2;
- }
- }
- void sift_DOWN(int parent){
- while (2 * parent + 1 < n) {
- int left = 2 * parent + 1;
- int right = 2 * parent + 2;
- int largest = left;
- if (right < n && HEAP[right].points > HEAP[left].points) {
- comparator(right, left);
- largest = right;
- }
- if(HEAP[parent].points > HEAP[largest].points)
- break;
- comparator(parent,largest);
- parent = largest;
- }
- }
- int main() {
- FILE *f = fopen("input.txt","r");
- FILE *out = fopen("output.txt", "w");
- int m;
- int num, point;
- fscanf(f,"%d",&n);
- fscanf(f,"%d", &m);
- for (int i = 0; i < n; ++i) {
- HEAP[i].number = i;
- }
- for (int i = 0; i < m; ++i) {
- fscanf(f,"%d",&num);
- fscanf(f,"%d",&point);
- for (int k = 0; k < n; ++k) {
- if(HEAP[k].number == num){
- HEAP[k].points += point;
- if(point > 0) {
- HEAP[k].date = ++date;
- sift_UP(k);
- }else sift_DOWN(k);
- break;
- }
- }
- printRES(out);
- /*for (int j = 0; j < n; ++j) {
- printf("%d[%d]{%d} ",HEAP[j].number, HEAP[j].points, HEAP[j].date);
- }
- printf("\n");*/
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement