    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    int comp(const void* a_, const void* b_) {
        return *(int*)a_ - *(int*)b_;
        }
    
    int main() {
        int N = 20;
        int* A = malloc(N * sizeof(int));
        int* B = malloc(N * sizeof(int));
        int* C = malloc(N * sizeof(int));
    
        for (int i = 0; i < N; ++i) {
            A[i] = rand() % 30;
            B[i] = rand() % 30;
            }
    
        for (int i = 0; i < N; ++i) printf("%d ", A[i]);
    
        puts("");
    
        for (int i = 0; i < N; ++i) printf("%d ", B[i]);
    
        puts("");
        // Отсортировали
        qsort(A, N, sizeof(int), comp);
        qsort(B, N, sizeof(int), comp);

        puts("");
        for (int i = 0; i < N; ++i) printf("%d ", A[i]);
        puts("");
        for (int i = 0; i < N; ++i) printf("%d ", B[i]);
        puts("");

        // Выбросили дубли
        int* a = A, *b = B;
        int NA, NB;
    
        for (int* c = a; ++a < A + N; NA = c - A + 1)
            if (*c != *a && ++c != a) * c = *a;
    
        for (int* c = b; ++b < B + N; NB = c - B + 1)
            if (*c != *b && ++c != b) * c = *b;
    
        puts("");
        for (int i = 0; i < NA; ++i) printf("%d ", A[i]);
        puts("");
        for (int i = 0; i < NB; ++i) printf("%d ", B[i]);
        puts("");

        // Находим разность отсортированных смножеств
        a = A;
        b = B;
        int j = 0;
    
        while (a < A + NA) {
            if (b == B + NB) {
                for (; a < A + NA;) C[j++] = *a++;
    
                break;
                }
    
            if (*a < *b) C[j++] = *a++;
            else {
                if (*b >= *a) a++;
    
                b++;
                }
            }
    
        printf("%d\n", j);
        for (int i = 0; i < j; ++i) printf("%d ", C[i]);
        puts("");
        }

