inlineint __read() { intx(0), t(1); charo(getchar()); while (o < '0' || o > '9') { if (o == '-') t = -1; o = getchar(); } for (; o >= '0' && o <= '9'; o = getchar()) { x = (x << 1) + (x << 3) + (o ^ 48); } return x * t; }
char S[maxn], T[maxn]; int nxt[maxn][26 << 1]; int d[26][26 << 1];
intmain() { scanf ("%s %s", S + 1, T + 1); int lens = strlen (S + 1), lent = strlen (T + 1);
for (int i = 0; i < 26; ++i) nxt[lens][i] = lens + 1;
for (int i = lens; i; --i) { for (int j = 0; j < 26; ++j) nxt[i - 1][j] = nxt[i][j]; nxt[i - 1][S[i] - 'a'] = i; }
int q = __read(); while (q--) { int l = __read(), r = __read(), len = r - l + 1;
inlineint __read() { intx(0), t(1); charo(getchar()); while (o < '0' || o > '9') { if (o == '-') t = -1; o = getchar(); } for (; o >= '0' && o <= '9'; o = getchar()) { x = (x << 1) + (x << 3) + (o ^ 48); } return x * t; }
int n, cnt, tot(1); int f[maxn], a[maxn], b[maxn], fm; bool vis[maxn]; vector <int> edge[maxn];
int Tree[maxn], Fac[maxn] = {1};
inlinevoidAdd(int X, int Val) { while (X <= n) { Tree[X] += Val; X += lowbit(X); } }
inlineintQuery(int X) { intAns(0); while (X) { Ans = (Ans + Tree[X]) % Mod; X -= lowbit(X); } return Ans; }
inlineintGetans(int Arr[], int Tmp[], int N) { int Ans = 1; sort(Tmp + 1, Tmp + 1 + N); for (int i = 1; i <= N; ++i) Arr[i] = lower_bound(Tmp + 1, Tmp + 1 + N, Arr[i]) - Tmp; for (int i = 1; i <= N; ++i) Fac[i] = 1ll * Fac[i - 1] * i % Mod, Add(i, 1); for (int i = 1; i <= N; ++i) { Ans = (Ans + ((1ll * Query(Arr[i]) - 1) * Fac[N - i]) % Mod) % Mod; Add(Arr[i], -1); } return Ans; }
inlineboolcheck(){ boolequ(1); for (int i = 1; i <= n; ++i) { if (equ && b[i] > a[i]) return1; if (b[i] < a[i]) equ = 0; } return0; }
boolCheck(int u) { for (int i = 0; i < edge[u].size(); ++i) { int v = edge[u][i]; if (Check(v) || b[v] < b[u]) return1; } return0; }
voiddfs(int step) { if (step >= n) { if (check()) return; if (!Check(1) && (++cnt) == 1){ for (int i = 1; i <= n; ++i) { printf ("%d ", b[i]); } } return ; } for (int i = n; i; --i) { if (vis[i]) continue; b[step + 1] = i; vis[i] = 1; dfs(step + 1); vis[i] = 0; } }
intmain() { n = __read(); for (int i = 1; i < n; ++i) tot = 1ll * tot * i % Mod; for (int i = 2; i <= n; ++i) { int f = __read(); fm = max(fm, f); edge[f].push_back(i); } for (int i = 1; i <= n; ++i) a[i] = b[i] = __read(); if (fm > 1) dfs(0), printf("\n%d\n", cnt); else { if (a[1] == 1) { for (int i = 1; i <= n; ++i) printf ("%d ", a[i]); puts(""); printf("%d\n", Getans(a, b, n)); } else { printf ("%d ", a[1]); for (int i = 2; i <= n; ++i) printf ("%d ", n - i + 2); printf("\n%d\n", tot); } } }