fork download
  1. program paletta;
  2. var i,z, dimpari, dimdispari:Longint;
  3. pari, dispari, controllo: array of longint;
  4. n_ribaltamenti, piccolidopo:int64;
  5. ordinabile: boolean;
  6. N : Longint;
  7. V : array of Longint;
  8. numero_ribaltamenti : Int64;
  9. { iterators used in for loops }
  10. i0: Longint;
  11.  
  12.  
  13. function SOMMA(X:longint):int64;
  14. begin
  15. SOMMA:=0;
  16. while (X >= 0) do
  17. begin
  18. SOMMA:=SOMMA+controllo[X];
  19. X := (X and (X+1)) -1;
  20. end
  21. end;
  22. Procedure modifica(X:longint; D:longint);
  23. begin
  24. while (X <D) do
  25. begin
  26. controllo[X]:=controllo[X]+1;
  27. X := X or (X+1);
  28. end
  29. end;
  30.  
  31. function paletta_sort(N: longint; V: array of longint): int64;
  32. begin
  33. if N mod 2 = 0 then begin dimpari:=N div 2; dimdispari:= dimpari; end
  34. else begin dimdispari:=N div 2 ; dimpari:= dimdispari+1; end;
  35. Setlength(pari, dimpari+1);
  36. Setlength(dispari, dimdispari+1);
  37. Setlength(controllo, N+1);
  38. for i:=0 to N-1 do if i mod 2 =0 then pari[i div 2 ]:=V[i] div 2;
  39. for i:=0 to N-1 do if i mod 2 <> 0 then dispari[i div 2 ]:=(V[i] -1) div 2 ;
  40. ordinabile:=true;
  41. for z:=0 to N-1 do if V[z] mod 2 <> z mod 2 then begin ordinabile:=false; n_ribaltamenti:=-1; end;
  42. if ordinabile=true then begin
  43. for i:=0 to dimpari do controllo[i]:=0;
  44. n_ribaltamenti:=0; piccolidopo:=0;
  45. for i:=dimpari -1 downto 0 do
  46. begin
  47. piccolidopo:=piccolidopo+somma(Pari[i]);
  48. modifica (pari[i], dimpari);
  49. end;
  50. n_ribaltamenti:=n_ribaltamenti+piccolidopo;
  51. for i:=0 to dimdispari do controllo[i]:=0;
  52. piccolidopo:=0;
  53. for i:=dimdispari-1 downto 0 do
  54. begin
  55. piccolidopo:=piccolidopo+somma(Dispari[i]);
  56. modifica (dispari[i], dimdispari);
  57. end;
  58. n_ribaltamenti:=n_ribaltamenti+piccolidopo;
  59. end;
  60. paletta_sort:=n_ribaltamenti;
  61. end;
  62.  
  63.  
  64.  
  65. begin
  66. { Reading input }
  67. read(N);
  68. Setlength(V, N);
  69. for i0 := 0 to N-1 do
  70. begin
  71. read(V[i0]);
  72. end;
  73.  
  74. { Calling functions }
  75. numero_ribaltamenti := paletta_sort(N, V);
  76.  
  77. { Writing output }
  78. writeln(numero_ribaltamenti);
  79.  
  80.  
  81. end.
  82.  
  83.  
  84.  
  85.  
Success #stdin #stdout 0s 5324KB
stdin
5
0 1 2 3 4
stdout
0