fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. mt19937_64 rd(time(0));
  5. int rand(int L, int R){
  6. return L + rd() % (R - L + 1);
  7. }
  8.  
  9. int n;
  10. vector<int> arr;
  11.  
  12. vector<int> sqrt_sort(vector<int>& arr, int length){
  13. if(length <= 1) return arr;
  14. if(length == 2){
  15. if(arr[0] < arr[1]) swap(arr[0], arr[1]);
  16. return arr;
  17. }
  18.  
  19. const int isqrt = sqrt(length) + 1;
  20. int times[isqrt]; memset(times, 0, sizeof times);
  21. vector<int> newVector[isqrt];
  22.  
  23. for(int i = 0; i < isqrt; i++){
  24. int cur_length = 0;
  25. for(int j = 0; j < isqrt; j++){
  26. if(i*isqrt + j >= length) break;
  27.  
  28. cur_length++;
  29. newVector[i].push_back(arr[i*isqrt + j]);
  30. }
  31.  
  32. newVector[i] = sqrt_sort(newVector[i], cur_length);
  33. }
  34.  
  35. vector<int> resultVector;
  36.  
  37. while(resultVector.size() < length){
  38. int cur_index = 0;
  39. int cur_value = (int) -1e9;
  40.  
  41. for(int i = 0; i < isqrt; i++){
  42. if(times[i] >= newVector[i].size()) continue;
  43.  
  44. if(cur_value <= newVector[i][times[i]]){
  45. cur_value = newVector[i][times[i]];
  46. cur_index = i;
  47. }
  48. }
  49.  
  50. resultVector.push_back(cur_value);
  51. times[cur_index]++;
  52. }
  53.  
  54. return resultVector;
  55. }
  56.  
  57. bool isSorted(){
  58. for(int i = 1; i < n; i++){
  59. if(arr[i - 1] < arr[i]) return 0;
  60. }
  61.  
  62. return 1;
  63. }
  64.  
  65. int main(){
  66. ios_base::sync_with_stdio(0);
  67. cin.tie(0); cout.tie(0);
  68.  
  69. cin >> n;
  70. for(int i = 0; i < n; i++){
  71. int value; cin >> value;
  72. arr.push_back(value);
  73. }
  74.  
  75. while(!isSorted()){
  76. arr = sqrt_sort(arr, n);
  77. }
  78.  
  79. for(int i = 0; i < n; i++) cout << arr[i] << ' ';
  80.  
  81. return 0;
  82. }
  83.  
Success #stdin #stdout 0s 5324KB
stdin
Standard input is empty
stdout
Standard output is empty