It’s Christmas time! PolandBall and his friends will be giving themselves gifts. There are n Balls overall. Each Ball has someone for whom he should bring a present according to some permutation p, p i ≠ i for all i.
Unfortunately, Balls are quite clumsy. We know earlier that exactly k of them will forget to bring their gift. A Ball number i will get his present if the following two constraints will hold:
- Ball number i will bring the present he should give.
- Ball x such that p x = i will bring his present.
What is minimum and maximum possible number of kids who will not get their present if exactly k Balls will forget theirs?
Input
The first line of input contains two integers n and k (2 ≤ n ≤ 106, 0 ≤ k ≤ n), representing the number of Balls and the number of Balls who will forget to bring their presents.
The second line contains the permutation p of integers from 1 to n, where p i is the index of Ball who should get a gift from the i-th Ball. For all i, p i ≠ i holds.
Output
You should output two values — minimum and maximum possible number of Balls who will not get their presents, in that order.
Examples
input
5 2
3 4 1 5 2
output
2 4
input
10 1
2 3 4 5 6 7 8 9 10 1
output
2 2
Note
In the first sample, if the third and the first balls will forget to bring their presents, they will be th only balls not getting a present. Thus the minimum answer is 2. However, if the first ans the second balls will forget to bring their presents, then only the fifth ball will get a present. So, the maximum answer is 4.
Solution:
#include <bits/stdc++.h> using namespace std; const int N = 1000010; bitset<N> b; int p[N]; int cnt[N]; bool was[N]; int main() { int n, k; scanf("%d %d", &n, &k); for (int i = 0; i < n; i++) { scanf("%d", p + i); p[i]--; was[i] = false; } for (int i = 1; i <= n; i++) { cnt[i] = 0; } int c1 = 0, c2 = 0; for (int i = 0; i < n; i++) { if (was[i]) { continue; } int x = i; int len = 0; while (!was[x]) { was[x] = true; x = p[x]; len++; } c1 += len % 2; c2 += len / 2; cnt[len]++; } b.set(n); for (int i = 1; i <= n; i++) { if (cnt[i] == 0) { continue; } int j = 1; while (cnt[i] > 0) { j = min(j, cnt[i]); int u = i * j; b |= (b >> u); cnt[i] -= j; j *= 2; } } int ans_min = k; if (!b.test(n - k)) { ans_min++; } int ans_max = 0; ans_max += 2 * min(k, c2); k -= min(k, c2); ans_max += min(k, c1); printf("%d %d\n", ans_min, ans_max); return 0; }