Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // author : greedyman shashank
- #include <bits/stdc++.h>
- using namespace std;
- void fast()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- cout.tie(NULL);
- }
- #define int long long int
- #define mod 1000000007
- #define pb push_back
- #define F first
- #define S second
- #define all(x) x.begin(), x.end()
- #define f(i, s, n) for (i = s; i < n; i++)
- #define yes cout << "yes" << endl;
- #define no cout << "no" << endl;
- #define vi vector<ll>
- #define vb vector<bool>
- #define pii pair<ll, ll>
- #define vpi vector<pii>
- #define umi unordered_map<ll, ll>
- #define mi map<ll, ll>
- #define si set<ll>
- void init_code()
- {
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- freopen("error.txt", "w", stderr);
- #endif // ONLINE_JUDGE
- }
- // fuck the implimentation im bad
- // good luck tho for next contst
- bool func(int i, int par, int pref, vector<vector<int>> &v, vector<int> &a, int req)
- {
- int x = a[i] + pref;
- if(x < -2e9 || pref < -2e9) {
- return false;
- }
- int sum = 0;
- //
- for (auto child : v[i])
- {
- if (child != par)
- {
- sum++;
- }
- }
- if (sum == 0)
- {
- if (x < 0)
- return false;
- else
- return true;
- }
- //
- if (i == 1)
- {
- if (x < req)
- {
- pref -= (req - x);
- }
- }
- else
- {
- if (x < 0)
- {
- pref += x;
- }
- }
- bool flag = true;
- for (auto child : v[i])
- {
- if (child != par)
- {
- flag = (flag && func(child, i, pref, v, a, req));
- }
- }
- return flag;
- }
- void solve()
- {
- int n;
- cin >> n;
- vector<int> a(n + 1);
- int x, y;
- int i, j, sum = 0, ans = 0;
- f(i, 1, n + 1)
- {
- cin >> a[i];
- }
- vector<vector<int>> v(n + 1);
- f(i, 0, n - 1)
- {
- cin >> x;
- v[i + 2].pb(x);
- v[x].pb(i + 2);
- }
- int low = a[1];
- int high = 2e9;
- int mid;
- while (low <= high)
- {
- mid = (low + high) / 2;
- int req = mid;
- bool flag = func(1, -1, 0, v, a, req);
- if (flag)
- {
- ans = req;
- low = mid + 1;
- }
- else
- high = mid - 1;
- }
- cout << ans << endl;
- return;
- }
- signed main()
- {
- init_code();
- fast();
- int t;
- cin >> t;
- while (t--)
- {
- solve();
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment