Guest User

Untitled

a guest
Nov 24th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.46 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. #define _MAX_ 100100                //TO JEST DO 'n' - OZNACZA ILOSC WYBOROW ZWIEKSZONE
  4. #define _MAX_ID_ 999999             //ILOSC ALGOLCZYKOW ZWIEKSZONA
  5.  
  6. #define _FATHER_ i/2                //INDEX OJCA
  7.  
  8. #define _CHANGE_(a,b) { tmp = a; a = b; b = tmp; }      //ZAMIANA ALGOLCZYKOW
  9. #define _CHANGE_ID_(a,b) { q=a ; a=b ; b=q ; }          //ZAMIANA INDEXOW
  10.  
  11.  
  12.  
  13. typedef struct y{
  14.     int id,pr;
  15. }algolczyk;
  16.  
  17.  
  18. algolczyk tab[_MAX_];           //TABLICA STRUKTUR ALGOLI
  19. int e=0 , record[_MAX_ID_];     //E - WYSOKOSC KOPCA  ||  RECORDY PRZECHOWUJA INDEXY
  20.  
  21.  
  22. void heapsort()                 //tu nie jestem pewien co do złożoności ale nic innego nie wychodziło ;/
  23. {
  24.     int i=e , q;
  25.     algolczyk tmp;
  26.  
  27.     for(i ; i>1 ; i--){
  28.         if((tab[i].pr > tab[_FATHER_].pr)  ||  ((tab[i].pr == tab[_FATHER_].pr) && (tab[i].id < tab[_FATHER_].id))){
  29.             _CHANGE_(tab[i] , tab[_FATHER_]);
  30.             _CHANGE_ID_(record[tab[i].id] , record[tab[_FATHER_].id]);
  31.         }
  32.  
  33.     }
  34. }
  35.  
  36.  
  37. void add()
  38. {
  39.     e++;                                //ZWIEKSZENIE KOPCA
  40.     scanf("%d %d", &tab[e].id , &tab[e].pr);
  41.     record[tab[e].id] = e;              //ZAPAMIETANIE INDEKSU ALGOLCZYKA
  42.  
  43.     heapsort();
  44. }
  45.  
  46. void readd()
  47. {
  48.     int a , b;          //A DO INDEKSY || B TO O ILE PODNOSIMY ŁAPOWKE
  49.     scanf("%d %d " , &a, &b);
  50.  
  51.     tab[record[a]].pr += b;         //OCZYWISCIE PODNOSIMY LAPOWKE
  52.  
  53.     heapsort();
  54. }
  55.  
  56.  
  57. int del()
  58. {
  59.     int q;              //ZMIENNE DO ZAMIAN
  60.     algolczyk tmp;
  61.  
  62.     if(!e){                     //JESLI E == 0 CZYLI BRAKUJE ELEMENTOW TO ZNACZY ZE PUSTY I WYSWIETLA BRAK I KONCZY FUNKCJE
  63.         printf("BRAK\n");
  64.         return 0;
  65.     }
  66.  
  67.     printf("%d\n",tab[1].id);       //WYSWIETLA PIERWSZY ELEMENT KTORY BEDZIE USUWANY
  68.  
  69.     _CHANGE_(tab[1] , tab[e]);                      //DWIE LINIE DO ZMIANY PIERWSZEGO I OSTATNIEGO ELEMENTU
  70.     _CHANGE_ID_(record[tab[1].id] , record[tab[e].id]);
  71.  
  72.     e--;        //ZMIEJSZENIE KOPCA O 1
  73.  
  74.     heapsort();
  75.  
  76.     return 0;
  77. }
  78.  
  79.  
  80.  
  81.  
  82. int main()
  83. {
  84.     int i , n;
  85.     char znak;      //PRZECHOWUJE ZNAK "A , I , P"
  86.  
  87.  
  88.         scanf("%d",&n);
  89.  
  90.     for(i=0;i<n;i++){
  91.         scanf("%s",&znak);
  92.  
  93.         switch(znak){
  94.             case 'A' :
  95.                 add();
  96.                 break;
  97.             case 'I' :
  98.                 readd();
  99.                 break;
  100.             case 'P' :
  101.                 del();
  102.                 break;
  103.         }
  104.     }
  105.  
  106.     return 0;
  107. }
Add Comment
Please, Sign In to add comment