1119 {
1120 int n;
1121 cin >> n;
1122 vector<int> vec1(n);
1123 vector<int> vec2(n);
1124 for(int i = 0; i < n; i++) {
1125 cin >> vec1[i];
1126 }
1127 for(int i = 0; i < n; i++) {
1128 cin >> vec2[i];
1129 }
1130 int i = n - 1;
1131 for(; i >= 0 && vec1[i] == vec2[i]; --i) {}
1132 vector<int> sorted_vec = vec1;
1133 sort(sorted_vec.begin(), sorted_vec.begin() + i + 1);
1134 bool insertion = true;
1135 for(int j = 0; j <= i; j++) {
1136 if(sorted_vec[j] != vec2[j]) {
1137 insertion = false;
1138 break;
1139 }
1140 }
1141 if(insertion) {
1142
1143 cout << "Insertion Sort" << endl;
1144 int j = n - 1;
1145 for(; j >= 0; --j) {
1146 vector vec1_cpy = vec1;
1147 sort(vec1_cpy.begin(), vec1_cpy.begin() + j);
1148 if(vec1_cpy == vec2) {
1149 break;
1150 }
1151 }
1152 sort(vec1.begin(), vec1.begin() + j + 1);
1153 for(int k = 0; k < n; k++) {
1154 cout << vec1[k];
1155 if(k != n - 1) {
1156 cout << ' ';
1157 }
1158 }
1159 return 0;
1160 }
1161
1162 cout << "Merge Sort" << endl;
1163 int factor = 1;
1164 bool flag = false;
1165 while(true) {
1166 factor *= 2;
1167 int j = 0;
1168 for(; (j + 1) * factor <= n; j++) {
1169 sort(vec1.begin() + j * factor, vec1.begin() + (j + 1) * factor);
1170 }
1171 if(j * factor < n) {
1172 sort(vec1.begin() + j * factor, vec1.end());
1173 }
1174 if(flag) {
1175 for(int k = 0; k < n; k++) {
1176 cout << vec1[k];
1177 if(k != n - 1) {
1178 cout << ' ';
1179 }
1180 }
1181 return 0;
1182 }
1183 if(vec1 == vec2) {
1184 flag = true;
1185 }
1186 }
1187 }