#include #include int movesdone = 0; int n, m, w; int typestart[52]; int wrongstart[52]; int cartype[52]; char sequence[20050]; int curmove; int movesource[100]; int movedest[100]; int rightspot(int i) { if (typestart[sequence[i]] <= i && (sequence[i] == m-1 || typestart[sequence[i]] > i)) return 1; else return 0; } void makemove(ofstream &output) { int i, j, k; if (curmove == 0) return; output << curmove; for (i = 0; i < curmove; i++) output << " " << (movesource[i]+1) << " " << (movedest[i]+1); output << "\n"; curmove = 0; movesdone++; /* if (movesdone == 19999) { }*/ /* if (movesdone == 3) { output.close(); exit(0); }*/ } int main() { ifstream input; ofstream output; int i, j; input.open ("car.in"); output.open ("car.out"); input >> n; input >> m; input >> w; int maxmoves = (n+w-2) / (w-1); for (i = 0; i < m; i++) cartype[i] = 0; for (i = 0; i < n; i++) { int x; input >> x; x--; sequence[i] = x; cartype[x]++; } typestart[0] = 0; for (i = 1; i < m; i++) typestart[i] = typestart[i-1] + cartype[i-1]; for (i = 0; i < m; i++) wrongstart[i] = typestart[i]; output << maxmoves << "\n"; curmove = 0; int typepos = 0; for (i = 0; i < n; i++) { while (typepos < m-1 && typestart[typepos+1] <= i) typepos++; if (sequence[i] == typepos) continue; int curguy = i; int oldvalue = sequence[i]; while (oldvalue != typepos && curmove < w-1) { movesource[curmove] = curguy; j = oldvalue; while (sequence[wrongstart[j]] == j) wrongstart[j]++; movedest[curmove] = wrongstart[j]; int newvalue = sequence[movedest[curmove]]; sequence[movedest[curmove]] = oldvalue; oldvalue = newvalue; curmove++; curguy = wrongstart[j]; } movesource[curmove] = curguy; movedest[curmove] = i; sequence[movedest[curmove]] = oldvalue; curmove++; if (curmove == w || curmove == w-1) makemove(output); i--; } makemove(output); while (movesdone < maxmoves) { output << 0 << "\n"; movesdone++; } /* output << "LOG:\n\n"; for (i = 0; i < n; i++) output << int(sequence[i]+1) << "\n"; output << "\n\n";*/ input.close (); output.close (); return 0; }