commit a5b17a679d641ba860c6e2a20bf662721ea79b74
parent 1d43dde251acb864f031659f5b5cd91aaf67dac2
author: anna <anna@superpozycja.net>
date: Sat, 6 Jun 2026 03:13:15 +0200
cses: add solutions so far
Signed-off-by: anna <anna@superpozycja.net>
diffstat:
33 files changed, 1244 insertions(+), 0 deletions(-)
diff --git a/00_intro/00_weird_algorithm/s.c b/00_intro/00_weird_algorithm/s.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+
+void solve()
+{
+ long long unsigned int n;
+
+ scanf("%llu", &n);
+ printf("%llu ", n);
+
+ while (n > 1)
+ printf("%llu ", n = (n % 2) ? 3 * n + 1 : n / 2);
+
+ printf("\n");
+ return;
+}
+
+int main()
+{
+ int t = 1;
+
+ while (t--)
+ solve();
+}
diff --git a/00_intro/01_missing_number/s.c b/00_intro/01_missing_number/s.c
@@ -0,0 +1,25 @@
+#include <stdio.h>
+
+void solve()
+{
+ unsigned long long s = 0;
+ unsigned long long n;
+
+ scanf("%llu", &n);
+
+ for(int i = 0; i < n - 1; i++) {
+ unsigned long long tmp;
+
+ scanf("%llu", &tmp);
+ s += tmp;
+ }
+ printf("%llu\n", (n*(n+1))/2 - s);
+ return;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/02_repetitions/s.c b/00_intro/02_repetitions/s.c
@@ -0,0 +1,24 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+void solve()
+{
+ int c;
+ int prev = '0';
+ unsigned long long res = 1;
+ unsigned long long running = 1;
+ while ((c = getchar()) != EOF) {
+ running = c == prev ? running + 1 : 1;
+ res = running > res ? running : res;
+ prev = c;
+ }
+ printf("%llu\n", res);
+ return;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/03_increasing_array/s.c b/00_intro/03_increasing_array/s.c
@@ -0,0 +1,28 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+void solve()
+{
+ unsigned int n;
+ unsigned int cur;
+ unsigned int prev = 0;
+ unsigned long long res = 0;
+ scanf("%u", &n);
+
+ for (int i = 0; i < n; i++) {
+ scanf("%u", &cur);
+ res += (cur < prev) * (prev - cur);
+ prev = cur < prev ? prev : cur;
+ }
+
+ printf("%llu\n", res);
+
+ return;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/04_permutations/s.c b/00_intro/04_permutations/s.c
@@ -0,0 +1,26 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+int solve()
+{
+ unsigned int n;
+
+ scanf("%u", &n);
+
+ if (n == 1) return printf("1\n");
+ if (n <= 3) return printf("NO SOLUTION\n");
+
+ for (unsigned i = 2; i <= n; i+=2) printf("%u ", i);
+ for (unsigned i = 1; i <= n; i+=2) printf("%u ", i);
+
+ printf("\n");
+
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/05_number_spiral/s.c b/00_intro/05_number_spiral/s.c
@@ -0,0 +1,25 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+int solve()
+{
+ unsigned long long x, y;
+
+ scanf("%llu %llu", &y, &x);
+
+ unsigned long long mx = x > y ? x : y;
+ unsigned long long mn = x < y ? x : y;
+ int sel = (mx % 2) ^ (y >= x);
+
+ printf("%llu\n", (mx - (sel)) * (mx - (sel)) + (2 * sel - 1) * (mn - 1 + (sel)));
+
+ return 0;
+}
+
+int main()
+{
+ int t;
+ scanf("%d", &t);
+ while (t--)
+ solve();
+}
diff --git a/00_intro/06_two_knights/s.c b/00_intro/06_two_knights/s.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+int solve()
+{
+ int k;
+ scanf("%d", &k);
+
+ printf("0\n");
+ for (long long i = 2; i <= k; i++)
+ printf("%lld\n", (i*i*(i*i-1))/2 - 4 * (i - 2) * (i - 1));
+
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/07_two_sets/s.c b/00_intro/07_two_sets/s.c
@@ -0,0 +1,57 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+int solve()
+{
+ long long lsum = 0, rsum = 0;
+ int *lset, *rset;
+ int li = 0, ri = 0;
+ int n;
+
+ scanf("%d", &n);
+
+ lset = malloc (sizeof(int) * n);
+ rset = malloc (sizeof(int) * n);
+
+ if (n % 4 == 1 || n % 4 == 2) {
+ printf("NO\n");
+ return 0;
+ }
+
+ printf("YES\n");
+
+ for (int i = n; i > 0; i--) {
+ if (lsum <= rsum) {
+ lset[li++] = i;
+ lsum += i;
+ }
+
+ else {
+ rset[ri++] = i;
+ rsum += i;
+ }
+ }
+
+ printf("%d\n", li);
+ for (int i = 0; i < li; i++)
+ printf("%d ", lset[i]);
+
+ printf("\n");
+
+ printf("%d\n", ri);
+ for (int i = 0; i < ri; i++)
+ printf("%d ", rset[i]);
+
+ printf("\n");
+
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/08_bit_strings/s.c b/00_intro/08_bit_strings/s.c
@@ -0,0 +1,48 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+#define MOD 1000000007
+
+int solve()
+{
+ uint32_t n;
+ uint64_t res = 1;
+ scanf("%u", &n);
+
+ n = ((n >> 1) & 0x55555555) | ((n & 0x55555555) << 1);
+ n = ((n >> 2) & 0x33333333) | ((n & 0x33333333) << 2);
+ n = ((n >> 4) & 0x0F0F0F0F) | ((n & 0x0F0F0F0F) << 4);
+ n = ((n >> 8) & 0x00FF00FF) | ((n & 0x00FF00FF) << 8);
+ n = ( n >> 16 ) | ( n << 16);
+
+ int r;
+ float f = (float) ( n & -n );
+ r = (*(uint32_t *)&f >> 23) - 0x7f;
+ n >>= r;
+
+ for (int i = 0; i < 32 - r; i++) {
+ if (n & 1) {
+ res *= res;
+ res %= MOD;
+ res <<= 1;
+ res %= MOD;
+ }
+ else {
+ res *= res;
+ res %= MOD;
+ }
+ n >>= 1;
+ }
+ printf("%llu\n", res);
+
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/09_trailing_zeros/s.c b/00_intro/09_trailing_zeros/s.c
@@ -0,0 +1,31 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+int solve()
+{
+ int res = 0;
+ int nn = 5;
+ int n;
+
+ scanf("%d", &n);
+
+ while (nn <= n) {
+ res += n / nn;
+
+ nn *= 5;
+ }
+
+ printf("%d\n", res);
+
+
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/10_coin_piles/.swp b/00_intro/10_coin_piles/.swp
Binary files differ.
diff --git a/00_intro/10_coin_piles/s.c b/00_intro/10_coin_piles/s.c
@@ -0,0 +1,33 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+int solve()
+{
+ int n;
+
+ scanf("%d", &n);
+
+ for (int i = 0; i < n; i++) {
+ uint64_t a, b;
+
+ scanf("%llu %llu", &a, &b);
+
+ if (a == b && a == 0) {
+ printf("YES\n");
+ continue;
+ }
+
+ printf("%s\n", ((a + b) % 3 == 0 && b / 2 <= a && a <= 2 * b) ? "YES" : "NO");
+ }
+
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/11_palindrome_reorder/.test.swp b/00_intro/11_palindrome_reorder/.test.swp
Binary files differ.
diff --git a/00_intro/11_palindrome_reorder/s.c b/00_intro/11_palindrome_reorder/s.c
@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+int solve()
+{
+ uint32_t abc[26] = { 0 };
+ uint8_t odd_ix;
+ uint8_t odds;
+ uint32_t n;
+ int i, j;
+ char c;
+
+ n = 0;
+ odds = 0;
+ odd_ix = 0xff;
+
+ while ((c = getchar()) != EOF) {
+ abc[c - 0x41]++;
+ n++;
+ }
+ n--;
+
+ for (i = 0; i < 26; i++) {
+ odds += abc[i] % 2;
+ if (abc[i] % 2)
+ odd_ix = i;
+ }
+
+ if (odds != n % 2) {
+ printf("NO SOLUTION\n");
+ return -1;
+ }
+
+ for (i = 0; i < 26; i++) {
+ if (i == odd_ix)
+ continue;
+
+ for (j = 0; j < abc[i]/2; j++)
+ putchar(i + 0x41);
+ }
+
+ if (odds)
+ for (i = 0; i < abc[odd_ix]; i++)
+ putchar(odd_ix + 0x41);
+
+ for (i = 25; i >= 0; i--) {
+ if (i == odd_ix)
+ continue;
+
+ for (j = 0; j < abc[i]/2; j++)
+ putchar(i + 0x41);
+ }
+
+ putchar('\n');
+
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/12_gray_code/s.c b/00_intro/12_gray_code/s.c
@@ -0,0 +1,34 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+int putb(unsigned long long n, unsigned long long sz)
+{
+ char b[sz + 1];
+ char *p = b + sizeof(b);
+ *--p = 0x00;
+ do {
+ *--p = 0x30 + (n & 1);
+ n >>= 1;
+ } while (sz--);
+ return puts(b);
+}
+
+int solve()
+{
+ int n;
+
+ scanf("%d", &n);
+ for (int i = 0; i < 1 << n; i++)
+ putb((i ^ i >> 1), n);
+
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/13_tower_of_hanoi/s.c b/00_intro/13_tower_of_hanoi/s.c
@@ -0,0 +1,51 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+int solve()
+{
+ uint16_t labels[3] = {1,3,2};
+ uint32_t n;
+ uint32_t i;
+ char *buf;
+ char *p;
+
+ scanf("%d", &n);
+
+ buf = malloc(sizeof(char) * 262146);
+ p = buf;
+
+ if (n % 2) {
+ labels[1] ^= labels[2];
+ labels[2] ^= labels[1];
+ labels[1] ^= labels[2];
+ }
+
+ labels[0] += '0';
+ labels[1] += '0';
+ labels[2] += '0';
+
+ p += sprintf(p, "%d\n", (1 << n) - 1);
+ memset_pattern4(p, "x x\n", 262146 - (p - buf));
+
+ for (i = 1; i < 1 << n; i++) {
+ *p = labels[((i & i - 1) % 3)];
+ p+=2;
+ *p = labels[(((i | i - 1) + 1) % 3)];
+ p+=2;
+ }
+
+ *p = '\0';
+
+ puts(buf);
+
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/14_creating_strings/s.c b/00_intro/14_creating_strings/s.c
@@ -0,0 +1,72 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+int comp (const void *a, const void *b)
+{
+ return (*(char *)a - *(char *)b);
+}
+
+uint64_t fact(uint64_t n) {
+ uint64_t res = 1;
+ for (int i = 2; i <= n; i++)
+ res *= i;
+ return res;
+}
+
+char a[8];
+
+int solve()
+{
+ char abc[26] = {0};
+ uint64_t res = 1;
+ char s[9];
+ char tmp;
+ int n;
+
+ scanf("%s", s);
+ n = strlen(s);
+ qsort(s, n, sizeof(char), comp);
+
+ for (int i = 0; i < n; i++)
+ abc[s[i]-'a']++;
+
+ res *= fact(n);
+
+ for (int i = 0; i < 26; i++)
+ res /= fact(abc[i]);
+
+ printf("%llu\n", res);
+
+ while (1) {
+ int j = n - 2;
+ int l = n - 1;
+
+ printf("%s\n", s);
+
+ while (j >= 0 && s[j] >= s[j + 1]) j--;
+ if (j < 0) break;
+
+ while (s[j] >= s[l]) l--;
+
+ tmp = s[j];
+ s[j] = s[l];
+ s[l] = tmp;
+
+ for (int k = j + 1, l = n - 1; k < l; k++, l--) {
+ tmp = s[k];
+ s[k] = s[l];
+ s[l] = tmp;
+ }
+ }
+
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/15_apple_division/.s.c.swp b/00_intro/15_apple_division/.s.c.swp
Binary files differ.
diff --git a/00_intro/15_apple_division/s.c b/00_intro/15_apple_division/s.c
@@ -0,0 +1,53 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+int comp (const void *a, const void *b)
+{
+ return (*(uint32_t *)b - *(uint32_t *)a);
+}
+
+int solve()
+{
+ uint64_t a = 0, b = 0, res, diff;
+ uint32_t *p;
+ int n, i, j, m;
+
+ scanf("%d", &n);
+
+ p = malloc(sizeof(uint32_t) * n);
+
+ for (i = 0; i < n; i++) {
+ scanf("%d", p + i);
+ a += p[i];
+ }
+
+ res = a;
+
+ for (i = 0; i < 1 << n; i++) {
+ b = a;
+ m = i;
+ j = 0;
+
+ while (m) {
+ b -= p[j++] * (m & 1);
+ m >>= 1;
+ }
+
+ diff = (a - b > b ? a - b - b : b - (a - b));
+ res = res < diff ? res : diff;
+
+ }
+
+ printf("%llu\n", res);
+
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/16_chessboard_and_queens/s.c b/00_intro/16_chessboard_and_queens/s.c
@@ -0,0 +1,72 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+uint8_t state[8][8];
+uint8_t b[8][8];
+uint64_t res;
+
+void backtrack(int n)
+{
+ int i;
+ int j;
+
+ if (n == 8) {
+ res++;
+ return;
+ }
+
+ for (i = 0; i < 8; i++) {
+ if (state[n][i] || b[n][i])
+ continue;
+
+ for (j = n; j < 8; j++)
+ state[j][i]++;
+
+ for (j = 0; i + j < 8 && n + j < 8; j++)
+ state[n+j][i+j]++;
+
+ for (j = 0; i - j >= 0 && n + j < 8; j++)
+ state[n+j][i-j]++;
+
+ backtrack(n + 1);
+
+ for (j = n; j < 8; j++)
+ state[j][i]--;
+
+ for (j = 0; i + j < 8 && n + j < 8; j++)
+ state[n+j][i+j]--;
+
+ for (j = 0; i - j >= 0 && n + j < 8; j++)
+ state[n+j][i-j]--;
+
+ }
+}
+
+int solve()
+{
+ int i;
+ int j;
+
+ for (i = 0; i < 8; i++) {
+ for (j = 0; j < 8; j++)
+ if (getchar() == '*')
+ b[i][j] = 1;
+
+ getchar();
+ }
+
+ backtrack(0);
+
+ printf("%llu\n", res);
+
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/17_raab_game_I/s.c b/00_intro/17_raab_game_I/s.c
@@ -0,0 +1,54 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+int solve()
+{
+ int a, b;
+ int n;
+ int i;
+
+ scanf("%d %d %d", &n, &a, &b);
+
+ if (a + b > n) {
+ printf("NO\n");
+ return 0;
+ }
+
+ if (a + b > 0 && (a == 0 || b == 0)) {
+ printf("NO\n");
+ return 0;
+ }
+
+ printf("YES\n");
+
+ for (i = 0; i < n - (a + b); i++)
+ printf("%d ", n - i);
+
+ for (i = b + 1; i < a + b + 1; i++)
+ printf("%d ", i);
+
+ for (i = 1 ; i < b + 1; i++)
+ printf("%d ", i);
+
+ printf("\n");
+
+ for (i = 0; i < n - (a + b); i++)
+ printf("%d ", n - i);
+
+ for (i = 1; i < a + b + 1; i++)
+ printf("%d ", i);
+
+ printf("\n");
+
+ return 0;
+}
+
+int main()
+{
+ int t;
+ scanf("%d", &t);
+ while (t--)
+ solve();
+}
diff --git a/00_intro/18_mex_grid_construction/.swo b/00_intro/18_mex_grid_construction/.swo
Binary files differ.
diff --git a/00_intro/18_mex_grid_construction/.swp b/00_intro/18_mex_grid_construction/.swp
Binary files differ.
diff --git a/00_intro/18_mex_grid_construction/s.c b/00_intro/18_mex_grid_construction/s.c
@@ -0,0 +1,40 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+int solve()
+{
+ int *row, *col;
+ int i, j, x;
+ int n, m;
+
+ scanf("%d", &n);
+
+ m = 2 * n;
+
+ row = malloc(sizeof(int) * m * n);
+ col = malloc(sizeof(int) * m * n);
+
+ for (i = 0; i < n; i++) {
+ for (j = 0; j < n; j++){
+ for (x = 0; x < m; x++)
+ if (!(row[m * i + x] || col[m * j + x]))
+ break;
+
+ row[m * i + x] = 1;
+ col[m * j + x] = 1;
+ printf("%d ", x);
+ }
+ printf("\n");
+ }
+
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/19_knight_moves_grid/s.c b/00_intro/19_knight_moves_grid/s.c
@@ -0,0 +1,124 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+struct payload {
+ int x;
+ int y;
+ int n;
+ int z;
+};
+
+struct node {
+ struct node *next;
+ void *payload;
+};
+
+struct node *new()
+{
+ struct node *n;
+
+ n = malloc(sizeof(struct node));
+ return n;
+}
+
+
+struct node *insert(struct node *tail, void *payload)
+{
+ struct node *node;
+ node = malloc(sizeof(struct node));
+ node->payload = payload;
+
+ tail->next = node;
+ return tail->next;
+}
+
+struct node *pop(struct node *head)
+{
+ struct node *new_head;
+
+ new_head = head->next;
+ free(head);
+
+ return new_head;
+}
+
+int *a;
+int *b;
+
+int solve()
+{
+ const int moves[8][2] = {
+ {-2, -1},
+ {-2, +1},
+ {-1, -2},
+ {-1, +2},
+ {+1, -2},
+ {+1, +2},
+ {+2, -1},
+ {+2, +1}
+ };
+
+ struct payload *payload;
+ struct node *head;
+ struct node *tail;
+ int i, j;
+ int n;
+
+ scanf("%d", &n);
+
+ payload = malloc(sizeof(struct payload));
+ payload->x = 0;
+ payload->y = 0;
+ payload->n = n;
+ payload->z = 0;
+
+ head = malloc(sizeof(struct node));
+ head->payload = payload;
+
+ tail = head;
+
+ a = calloc(n * n, sizeof(int));
+ b = calloc(n * n, sizeof(int));
+
+ b[0]= 1;
+
+ do {
+ payload = head->payload;
+ for (i = 0; i < 8; i++) {
+ if (payload->x + moves[i][0] >= 0
+ && payload->x + moves[i][0] < n
+ && payload->y + moves[i][1] >= 0
+ && payload->y + moves[i][1] < n
+ && b[n * (payload->x + moves[i][0]) + payload->y + moves[i][1]] != 1
+ ) {
+ struct payload *tmp;
+ tmp = malloc(sizeof(struct payload));
+ a[n * (payload->x + moves[i][0]) + payload->y + moves[i][1]] = payload->z + 1;
+ b[n * (payload->x + moves[i][0]) + payload->y + moves[i][1]] = 1;
+ tmp->x = payload->x + moves[i][0];
+ tmp->y = payload->y + moves[i][1];
+ tmp->n = payload->n;
+ tmp->z = payload->z + 1;
+ tail = insert(tail, tmp);
+ }
+ }
+ head = head->next;
+ } while(head->next != NULL);
+
+ for (i = 0; i < n; i++) {
+ for (j = 0; j < n; j++)
+ printf("%d ", a[n * i + j]);
+ printf("\n");
+ }
+
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/20_grid_coloring/s.c b/00_intro/20_grid_coloring/s.c
@@ -0,0 +1,46 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+int solve()
+{
+ int n, m;
+ int i, j;
+ int x;
+
+ scanf("%d %d\n", &n, &m);
+
+ int a[n + 1][m + 1];
+
+ memset(a, 0, sizeof(a));
+
+ int res[n][m];
+
+ for (i = 1; i < n + 1; i++) {
+ for (j = 1; j < m + 1; j++) {
+ a[i][j] = getchar();
+ for (x = 'A'; x <= 'D'; x++)
+ if (x != a[i][j] && x != res[i-2][j-1] && x != res[i-1][j-2])
+ break;
+ res[i-1][j-1] = x;
+ }
+
+ getchar();
+ }
+
+ for (i = 0; i < n; i++) {
+ for (j = 0; j < m; j++)
+ printf("%c", res[i][j]);
+ printf("\n");
+ }
+
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/21_digit_queries/.swp b/00_intro/21_digit_queries/.swp
Binary files differ.
diff --git a/00_intro/21_digit_queries/s.c b/00_intro/21_digit_queries/s.c
@@ -0,0 +1,53 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+int solve()
+{
+ uint64_t acc;
+ uint64_t k;
+ uint64_t n;
+ uint64_t p;
+ uint64_t b;
+ uint64_t d;
+ int i;
+ int j;
+
+ scanf("%llu", &k);
+
+ if (k < 10) {
+ printf("%llu\n", k);
+ return 0;
+ }
+
+ n = 9;
+ acc = 0;
+ b = 1;
+
+ for (i = 1; i < 100; i++, n *= 10) {
+ acc += i * n;
+ if (k <= acc)
+ break;
+ b *= 10;
+ }
+
+ p = (k - (acc - (i *n))) - 1;
+ n = b + (p / i);
+ d = p % i;
+
+ for (j = 0; j < i - d - 1; j++)
+ n/=10;
+
+ printf("%llu\n", n % 10);
+
+ return 0;
+}
+
+int main()
+{
+ int t;
+ scanf("%d", &t);
+ while (t--)
+ solve();
+}
diff --git a/00_intro/22_string_reorder/s.c b/00_intro/22_string_reorder/s.c
@@ -0,0 +1,29 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+int solve()
+{
+ char a[26] = {0};
+ char s[1000001];
+ char c;
+ int i;
+ int j;
+
+ scanf("%s", s);
+
+ i = 0;
+
+ while ((c = s[i++]) != '\0')
+ a[c - 'A']++;
+
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/23_grid_path_description/s.c b/00_intro/23_grid_path_description/s.c
@@ -0,0 +1,74 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <unistd.h>
+
+int a[9][9];
+char d[49];
+int res;
+
+void backtrack(int x, int y, int n, int prev)
+{
+ if (x == 7 && y == 1) {
+ if (n == 48)
+ res++;
+ return;
+ }
+
+ if (prev == 1 && a[x-1][y] && !a[x][y+1] && !a[x][y-1])
+ return;
+
+ if (prev == 0 && a[x+1][y] && !a[x][y+1] && !a[x][y-1])
+ return;
+
+ if (prev == 3 && a[x][y-1] && !a[x+1][y] && !a[x-1][y])
+ return;
+
+ if (prev == 2 && a[x][y+1] && !a[x+1][y] && !a[x-1][y])
+ return;
+
+ a[x][y] = 1;
+
+ if (x < 7 && !a[x+1][y] && (d[n] == 'D' || d[n] == '?'))
+ backtrack(x + 1, y, n + 1, 0);
+ if (x > 1 && !a[x-1][y] && (d[n] == 'U' || d[n] == '?'))
+ backtrack(x - 1, y, n + 1, 1);
+
+ if (y < 7 && !a[x][y+1] && (d[n] == 'R' || d[n] == '?'))
+ backtrack(x, y + 1, n + 1, 2);
+ if (y > 1 && !a[x][y-1] && (d[n] == 'L' || d[n] == '?'))
+ backtrack(x, y - 1, n + 1, 3);
+
+ a[x][y] = 0;
+
+ return;
+}
+
+int solve()
+{
+ int i;
+
+ scanf("%s", d);
+
+ for (i = 0; i < 9; i++)
+ a[0][i] = 1;
+ for (i = 0; i < 9; i++)
+ a[i][0] = 1;
+ for (i = 0; i < 9; i++)
+ a[8][i] = 1;
+ for (i = 0; i < 9; i++)
+ a[i][8] = 1;
+
+ backtrack(1, 1, 0, 0);
+
+ printf("%d\n", res);
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/00_intro/s.c b/00_intro/s.c
@@ -0,0 +1,17 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+int solve()
+{
+ return 0;
+}
+
+int main()
+{
+ int t;
+ scanf("%d", &t);
+ while (t--)
+ solve();
+}
diff --git a/01_sorting_and_searching/00_distinct_numbers/s.c b/01_sorting_and_searching/00_distinct_numbers/s.c
@@ -0,0 +1,99 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+/* TODO change this to a rbtree */
+
+struct node {
+ struct node *l;
+ struct node *p;
+ int key;
+};
+
+struct node *add_node(struct node **headp, int key)
+{
+ struct node *tmp;
+ struct node *head = *headp;
+
+ if (!head) {
+ head = malloc(sizeof(struct node));
+ head->l = NULL;
+ head->p = NULL;
+ head->key = key;
+ return head;
+ }
+
+ tmp = malloc(sizeof(struct node));
+ tmp->l = NULL;
+ tmp->p = NULL;
+ tmp->key = key;
+
+ while (1) {
+ if (key > head->key) {
+ if (head->p)
+ head = head->p;
+ else
+ break;
+ } else {
+ if (head->l)
+ head = head->l;
+ else
+ break;
+ }
+ }
+
+ if (key > head->key)
+ head->p = tmp;
+ else
+ head->l = tmp;
+
+ return tmp;
+}
+
+int search_btree(struct node *head, int key)
+{
+ while (head) {
+ if (key == head->key)
+ return 1;
+ if (key > head->key)
+ head = head->p;
+ else
+ head = head->l;
+ }
+ return 0;
+}
+
+int solve()
+{
+ struct node *head = NULL;
+ uint32_t res;
+ int n, i;
+
+ scanf("%d", &n);
+
+ res = 0;
+ for (i = 0; i < n; i++) {
+ int x;
+
+ scanf("%d", &x);
+ if (!search_btree(head, x)) {
+ res++;
+ if (!head)
+ head = add_node(&head, x);
+ else
+ add_node(&head, x);
+ }
+ }
+
+ printf("%u\n", res);
+
+ return 0;
+}
+
+int main()
+{
+ int t = 1;
+ while (t--)
+ solve();
+}
diff --git a/01_sorting_and_searching/s.c b/01_sorting_and_searching/s.c
@@ -0,0 +1,17 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+int solve()
+{
+ return 0;
+}
+
+int main()
+{
+ int t;
+ scanf("%d", &t);
+ while (t--)
+ solve();
+}