(I2
I162
I6
(dp0
Vtable.%l
p1
(Vmain.cpp
p2
S'#include <cstdio>\r\n#include <algorithm>\r\nusing namespace std;\r\nconst int NMAX = 35;\r\nlong long ans = 0, sol;\r\nint nr, n, X, Y, Z;\r\nint a[NMAX + 5], b[NMAX + 5], c[NMAX + 5];\r\nbool viz[NMAX + 5];\r\ninline void solve()\r\n{\r\n    int ca[NMAX + 5], cb[NMAX + 5];\r\n    int nr1 = 0, nr2 = 0;\r\n    for (register int i = 1; i <= Z; ++i)\r\n        if (((1 << i) & sol) == 0)\r\n            cb[++nr2] = c[i];\r\n        else\r\n            ca[++nr1] = c[i];\r\n\r\n    int st = 1, dr = 1, st2 = 1, dr2 = 1;\r\n    for (register int i = 1; i <= n; ++i)\r\n    {\r\n        int x, y;\r\n        if (st == X + 1)\r\n            x = ca[dr], ++dr;\r\n        else if (dr == nr1 + 1)\r\n            x = a[st], ++st;\r\n        else if (a[st] > ca[dr])\r\n            x = ca[dr], ++dr;\r\n        else\r\n            x = a[st], ++st;\r\n\r\n        if (st2 == Y + 1)\r\n            y = cb[dr2], ++dr2;\r\n        else if (dr2 == nr2 + 1)\r\n            y = b[st2], ++st2;\r\n        else if (b[st2] > cb[dr2])\r\n            y = cb[dr2], ++dr2;\r\n        else\r\n            y = b[st2], ++st2;\r\n\r\n        if (x > y)\r\n            return ;\r\n    }\r\n    ++ans;\r\n}\r\nvoid back(int poz, int k)\r\n{\r\n    if (poz == nr)\r\n    {\r\n        solve();\r\n        return ;\r\n    }\r\n    for (register int i = k + 1; i <= Z - (nr - poz) + 1; ++i)\r\n        if (((1LL * (1 << i)) & sol) == 0)\r\n        {\r\n            sol += (1 << i);\r\n            back(poz + 1, i);\r\n            sol -= (1 << i);\r\n        }\r\n}\r\nint main()\r\n{\r\n    //freopen("date.in", "r", stdin);\r\n    //freopen("date.out", "w", stdout);\r\n    scanf("%d", &n);\r\n    scanf("%d", &X);\r\n    for (register int i = 1; i <= X; ++i)\r\n        scanf("%d", &a[i]), viz[a[i]] = 1;\r\n    sort (a + 1, a + X + 1);\r\n    scanf("%d", &Y);\r\n    for (register int i = 1; i <= Y; ++i)\r\n        scanf("%d", &b[i]), viz[b[i]] = 1;\r\n    sort (b + 1, b + Y + 1);\r\n\r\n    if (Y == 0 && X == 0)\r\n    {\r\n        long long rez = 1;\r\n        for (register int i = n + 1; i <= 2 * n; ++i)\r\n            rez *= 1LL * i;\r\n        for (register int i = 1; i <= n; ++i)\r\n            rez /= 1LL * i;\r\n        printf("%lld\\n", rez);\r\n        return 0;\r\n    }\r\n    /// Pas 1: Vedem care nr vor face parte 100% din prima multime\r\n    if (1 + X > n)// Daca sunt prea multe numere atunci nu avem nici o solutie\r\n    {\r\n        printf("0");\r\n        return 0;\r\n    }\r\n    if (!viz[1])\r\n        a[++X] = 1, viz[1] = 1;\r\n    else\r\n    {\r\n        printf("0");\r\n        return 0;\r\n    }\r\n    sort (a + 1, a + X + 1);\r\n\r\n    /// Pas 2: Vedem care nr vor face parte 100% din a doua multime\r\n    if (1 + Y > n && b[Y] != 2 * n) // Daca sunt prea multe numere atunci nu avem nici o solutie\r\n    {\r\n        printf("0");\r\n        return 0;\r\n    }\r\n\r\n    if (!viz[2 * n])\r\n        b[++Y] = 2 * n, viz[2 * n] = 1;\r\n    else\r\n    {\r\n        printf("0");\r\n        return 0;\r\n    }\r\n\r\n    /// Pas 3: Formam multimea C\r\n    for (register int i = 1; i <= 2 * n; ++i)\r\n        if (!viz[i])\r\n            c[++Z] = i;\r\n    /// Pas 4: Combinari\r\n    nr = n - X;\r\n    back(0, 0);\r\n    printf("%lld\\n", ans);\r\n    return 0;\r\n}\r\n'
p3
tp4
stp5
.