Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- struct Panstwo
- {
- int nr,wspolczynnik;
- };
- //void display(Panstwo* tab,int n)
- //{
- // for(int i=0;i<n;++i)
- // {
- // cout<<tab[i].nr<<" "<<tab[i].wspolczynnik<<endl;
- // }cout<<endl;
- //}
- int sortujgalaz_w_gore(int*& indexy,Panstwo*& tab,int indextablicy,int wszystkich_elementow)//warstw = getlayer
- {
- int ile=0; int ojciec=indexy[indextablicy];/*potrzebne tak?*/
- for(;indextablicy>=0&&ojciec>0;--indextablicy,indextablicy/=2)
- {
- ojciec--;
- ojciec/=2;
- if(tab[indextablicy].wspolczynnik>tab[ojciec].wspolczynnik)//a jak sa rowne to nic nie zamieniaj
- {
- swap(tab[indextablicy],tab[ojciec]);
- swap(indexy[indextablicy],indexy[ojciec]);
- ++ile;
- }
- // else
- // {//prawy wiekszy wspolczynnik i wiekszy index
- // if(indexy[indextablicy+1]<=/*<*/wszystkich_elementow)//istnieje prawy brat!
- // {
- // if(tab[indextablicy].wspolczynnik>/*<=*/tab[indextablicy+1].wspolczynnik)
- // {
- // swap(tab[indextablicy],tab[indextablicy+1]);
- // swap(indexy[indextablicy],indexy[indextablicy]);
- // ++ile;
- // }
- // else if(tab[indextablicy].wspolczynnik==tab[indextablicy+1].wspolczynnik)
- // {
- // if(tab[indextablicy].nr>tab[indextablicy+1].nr)
- // {
- // swap(tab[indextablicy],tab[indextablicy+1]);
- // swap(indexy[indextablicy],indexy[indextablicy]);
- // ++ile;
- // }
- // }
- // }
- // break;
- // }
- }
- return ile;
- }
- int sortujgalaz_w_dol(int*& indexy,Panstwo*& tab,int indextablicy,int wszystkich_elementow)
- {
- // Gdy przesiewamy w dół zamieniamy miejsce ojca
- // z tym synem który ma większą wartość,
- // jeżeli synowie są równi to zamieniamy z lewym synem
- int ile=0;
- for(;indexy[indextablicy]<wszystkich_elementow;indextablicy*=2,++indextablicy)
- {
- int lsyn=indextablicy*=2;++lsyn;//SPRAWDZAC CZY TO NIE WYJDZIE POZA ZAKRES!?
- int psyn=lsyn+1;
- if(tab[indextablicy].wspolczynnik<tab[lsyn].wspolczynnik||tab[indextablicy].wspolczynnik<tab[psyn].wspolczynnik)
- {
- if(tab[lsyn].wspolczynnik>=/**/tab[psyn].wspolczynnik)
- {
- swap(tab[indextablicy],tab[lsyn]);
- swap(indexy[indextablicy],indexy[lsyn]);
- ++ile;
- }
- else
- {
- swap(tab[indextablicy],tab[psyn]);
- swap(indexy[indextablicy],indexy[psyn]);
- ++ile;
- }
- }
- else
- {
- break;
- }
- }
- return ile;
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- int n;cin>>n;
- int ile=0,i;
- Panstwo* tab=new Panstwo[n];
- int* indexy=new int[1001];//przechowuje indeksy elementow /*zalozenie n<=1000*/
- for(i=0;i<n;++i)
- {
- cin>>tab[i].nr;
- cin>>tab[i].wspolczynnik;
- indexy[tab[i].nr]=i;//zeby latwiej bylo szukac to przypisane indeksy
- }
- int m;cin>>m;
- for(int j=0;j<m;++j)
- {
- int p,w;
- cin>>p>>w;
- int szukany=indexy[p/*i*/];//index szukanego elementu
- tab[szukany].wspolczynnik=w;//zmiana wartosci
- if(w>tab[(szukany-1)/2].wspolczynnik)
- {
- /*przesiewaj w gore*/
- ile+=sortujgalaz_w_gore(indexy,tab,p,n);
- }
- else if(w<tab[(szukany*2)+1].wspolczynnik||w<tab[(szukany*2)+2].wspolczynnik)
- {
- ile+=sortujgalaz_w_dol(indexy,tab,p,n);
- /*przesiewaj w dol*/
- }//nie sprawdzam czy mniejsze od prawego lub mniejsze od prawego
- }
- cout<<ile;
- delete [] tab;
- delete [] indexy;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement