import java.io.*;
import java.util.*;

public class TestGen {

	static int done = 0;

	static final Random rnd = new Random(556668949239L);

	static int rand(int n) {
		if (n == 0)
			return 1;
		return rnd.nextInt(n);
	}

	static final int MAXN1 = 1000;
	static final int MAXN2 = 100000;

	static ArrayList<Integer> data = new ArrayList<Integer>();

	static void print() throws IOException {
		done++;
		System.err.println("Generation test #" + done);
		PrintWriter out;
		if (done < 10)
			out = new PrintWriter("../tests/0" + String.valueOf(done));
		else
			out = new PrintWriter("../tests/" + String.valueOf(done));
		int n = data.size() / 2;
		out.println(n);
		for (int i = 0; i < n - 1; i++)
			out.print(data.get(i) + " ");
		out.println(data.get(n - 1));
		for (int i = n; i < 2 * n - 1; i++)
			out.print(data.get(i) + " ");
		out.println(data.get(2 * n - 1));
		data.clear();
		out.close();
	}

	static void gen_sample() throws IOException {
		PrintWriter out;
		out = new PrintWriter("../preliminary/01");
		out.println("3");
		out.println("1 2 1");
		out.println("1 2 3");
		out.close();
		out = new PrintWriter("../preliminary/02");
		out.println("5");
		out.println("4 1 5 9 3");
		out.println("9 7 9 8 8");
		out.close();
	}

	static void gen_rand0(int n, int maxv, int maxt) throws IOException {
		for (int i = 0; i < n; i++)
			data.add(rand(maxv) + 1);
		for (int i = 0; i < n; i++)
			data.add(rand(maxt) + 1);
		print();
	}

	static void gen_rand1(int n, int maxv, int maxt) throws IOException {
		for (int i = 0; i < n; i++)
			data.add(rand(maxv / 2) + maxv / 2);
		for (int i = 0; i < n; i++)
			data.add(rand(maxt / 2) + maxt / 2);
		print();
	}

	static int max(int a, int b) {
		if (a > b)
			return a;
		return b;
	}

	static void gen_sort_time(int n, int maxv, int maxt) throws IOException {
		for (int i = 0; i < n; i++)
			data.add(rand(maxv) + 1);
		for (int i = 1; i <= n; i++)
			data.add(i + max(0, maxt - n));
		print();
	}

	static void gen_same_time(int n, int maxv, int t) throws IOException {
		for (int i = 0; i < n; i++)
			data.add(rand(maxv) + 1);
		for (int i = 0; i < n; i++)
			data.add(t);
		print();
	}

	static void gen_spec0(int n, int maxv, int maxt) throws IOException {
		data.add(n - 2);
		for (int i = 1; i < n; i++)
			data.add(1);
		data.add(maxt);
		for (int i = 1; i < n; i++)
			data.add(i);
		print();
	}

	static void gen_spec1(int n, int maxv, int maxt) throws IOException {
		for (int i = 0; i < n; i++)
			data.add(rand(maxv / 2) + maxv / 2);
		for (int i = 0; i < n; i++)
			if (rand(4) == 0)
				data.add(maxt);
			else
				data.add(i + 1);
		print();
	}

	static void gen_max0(int n, int maxv, int maxt) throws IOException {
		for (int i = 0; i < n; i++)
			data.add(maxv);
		for (int i = 0; i < n; i++)
			data.add(maxt);
		print();
	}

	static void gen_max1(int n, int maxv, int maxt) throws IOException {
		for (int i = 0; i < n; i++)
			data.add(maxv);
		for (int i = 0; i < n; i++)
			data.add(i + 1);
		print();
	}

	static void gen_max2(int n, int maxv, int maxt) throws IOException {
		for (int i = 0; i < n; i++)
			data.add(maxv);
		data.add(maxt);
		for (int i = 1; i < n; i++)
			data.add(i);
		print();
	}

	static void gen_max3(int n, int maxv, int maxt) throws IOException {
		for (int i = 0; i < n; i++)
			data.add(maxv);
		for (int i = 0; i < n; i++)
			if (rand(4) == 0)
				data.add(maxt);
			else
				data.add(i + 1);
		print();
	}

	public static void main(String[] args) throws IOException {
		new File("../preliminary").mkdir();
		new File("../tests").mkdir();
		done = 0;
		gen_sample();
		// rand tests
		for (int i = 0; i < 5; i++) {
			gen_rand0(rand(50) + 50, 1000, 1000);
			gen_rand1(rand(50) + 50, 1000, 1000);
		}
		//
		int maxn = 1000;
		gen_rand0(rand(maxn / 2) + maxn / 2, 100, 100);
		gen_rand1(rand(maxn / 2) + maxn / 2, 100, 100);
		gen_same_time(rand(maxn / 2) + maxn / 2, 100, 100);
		gen_sort_time(rand(maxn / 2) + maxn / 2, 100, 100);
		gen_spec0(rand(maxn / 2) + maxn / 2, 100, 100);
		gen_spec1(rand(maxn / 2) + maxn / 2, 100, 100);
		gen_max0(rand(maxn / 2) + maxn / 2, 100, 100);
		gen_max1(rand(maxn / 2) + maxn / 2, 100, 100);
		gen_max2(rand(maxn / 2) + maxn / 2, 100, 100);
		gen_max3(rand(maxn / 2) + maxn / 2, 100, 100);
		//
		gen_rand0(maxn, 1000000000, 100000);
		gen_rand1(maxn, 1000000000, 100000);
		gen_same_time(maxn, 1000000000, 100000);
		gen_sort_time(maxn, 1000000000, 100000);
		gen_spec0(maxn, 1000000000, 100000);
		gen_spec1(maxn, 1000000000, 100000);
		gen_max0(maxn, 1000000000, 100000);
		gen_max1(maxn, 1000000000, 100000);
		gen_max2(maxn, 1000000000, 100000);
		gen_max3(maxn, 1000000000, 100000);
		//
		//
		maxn = 100000;
		gen_rand0(rand(maxn / 2) + maxn / 2, 10000, 10000);
		gen_rand1(rand(maxn / 2) + maxn / 2, 10000, 10000);
		gen_same_time(rand(maxn / 2) + maxn / 2, 10000, 10000);
		gen_sort_time(rand(maxn / 2) + maxn / 2, 10000, 10000);
		gen_spec0(rand(maxn / 2) + maxn / 2, 10000, 10000);
		gen_spec1(rand(maxn / 2) + maxn / 2, 10000, 10000);
		gen_max0(rand(maxn / 2) + maxn / 2, 10000, 10000);
		gen_max1(rand(maxn / 2) + maxn / 2, 10000, 10000);
		gen_max2(rand(maxn / 2) + maxn / 2, 10000, 10000);
		gen_max3(rand(maxn / 2) + maxn / 2, 10000, 10000);
		//
		gen_rand0(maxn, 1000000000, 100000);
		gen_rand1(maxn, 1000000000, 100000);
		gen_same_time(maxn, 1000000000, 100000);
		gen_sort_time(maxn, 1000000000, 100000);
		gen_spec0(maxn, 1000000000, 100000);
		gen_spec1(maxn, 1000000000, 100000);
		gen_max0(maxn, 1000000000, 100000);
		gen_max1(maxn, 1000000000, 100000);
		gen_max2(maxn, 1000000000, 100000);
		gen_max3(maxn, 1000000000, 100000);

		return;
	}
}
