about summary refs log tree commit diff
path: root/codechef/intxor.c
diff options
context:
space:
mode:
authorNguyễn Gia Phong <vn.mcsinyx@gmail.com>2018-12-12 01:10:38 +0700
committerNguyễn Gia Phong <vn.mcsinyx@gmail.com>2018-12-12 01:10:38 +0700
commit5e48d2ec45a065cc81781995bf461415563da086 (patch)
tree89c213a2d47bcf7790b3cc4873c81fd8c1ccefc8 /codechef/intxor.c
parent054428243ccb1c0b39c7fdf8faa449ce415789ce (diff)
downloadcp-5e48d2ec45a065cc81781995bf461415563da086.tar.gz
maxep is only 25% AC )-:
Diffstat (limited to 'codechef/intxor.c')
-rw-r--r--codechef/intxor.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/codechef/intxor.c b/codechef/intxor.c
new file mode 100644
index 0000000..f914576
--- /dev/null
+++ b/codechef/intxor.c
@@ -0,0 +1,74 @@
+#include <stdio.h>
+
+/* For the sake of performance */
+long a[50000], b[50000];
+
+void longxor(long n)
+{
+	long i, all = 0, almost = 0, vacancy = 0;
+
+	for (i = 0; i < n; i++) {
+		printf("1 %ld %ld %ld\n",
+		       i + 1, (i + 1) % n + 1, (i + 2) % n + 1);
+		fflush(stdout);
+		scanf("%ld", b + i);
+		all ^= b[i];
+	}
+
+	for (i = 2 - n % 3; i < n; i += 3)
+		almost ^= b[i];
+
+	for (i = 0; i < n; i++) {
+		a[vacancy] = all ^ almost;
+		all ^= b[vacancy] ^ b[(vacancy + 1) % n];
+		vacancy = (vacancy + 3) % n;
+	}
+}
+
+void fourxor(long n)
+{
+	printf("1 %ld %ld %ld\n", n - 2, n - 1, n);
+	fflush(stdout);
+	scanf("%ld", b);
+	printf("1 %ld %ld %ld\n", n - 3, n - 1, n);
+	fflush(stdout);
+	scanf("%ld", b + 1);
+	printf("1 %ld %ld %ld\n", n - 3, n - 2, n);
+	fflush(stdout);
+	scanf("%ld", b + 2);
+	printf("1 %ld %ld %ld\n", n - 3, n - 2, n - 1);
+	fflush(stdout);
+	scanf("%ld", b + 3);
+
+	long all = b[0] ^ b[1] ^ b[2] ^ b[3];
+	a[n - 4] = all ^ b[0];
+	a[n - 3] = all ^ b[1];
+	a[n - 2] = all ^ b[2];
+	a[n - 1] = all ^ b[3];
+}
+
+int main()
+{
+	long t, n, i = 1;
+
+	scanf("%ld", &t);
+	while (t-- && i == 1) {
+		scanf("%ld", &n);
+		if (n % 3) {
+			longxor(n);
+		} else {
+			longxor(n - 4);
+			fourxor(n);
+		}
+
+		putchar(50);
+		for (i = 0; i < n; i++)
+			printf(" %ld", a[i]);
+		putchar(10);
+		fflush(stdout);
+
+		scanf("%ld", &i);
+	}
+
+	return 0;
+}