func_code_string: #include <bits/stdc++.h>   using namespace std;   struct SegmentTree {     int n;     struct node {       long long add, mn;       node() {}       node(long long v) : mn(v), add(0) {}     };     vector<node> tree;     void push(int id, int l, int r) {       if (tree[id].add != 0) {         int m = (l + r) >> 1;         apply(id << 1, l, m, tree[id].add);         apply(id << 1 | 1, m + 1, r, tree[id].add);         tree[id].add = 0;       }     }     void apply(int id, int l, int r, long long add) {       tree[id].mn += add;       tree[id].add += add;     }     void pull(int id) {       tree[id].mn = min(tree[id << 1].mn, tree[id << 1 | 1].mn);     }     SegmentTree(int n) : n(n), tree(4 * n) {}     SegmentTree(const vector<long long> &v) {       n = (int)v.size();       tree.resize(4 * n);       function<void(int, int, int)> build = [&](int id, int l, int r) {         if (l == r) {           tree[id] = v[l];           return;         }         push(id, l, r);         int m = (l + r) >> 1;         build(id << 1, l, m);         build(id << 1 | 1, m + 1, r);         pull(id);       };       build(1, 0, n - 1);     }     void rangeadd(int id, int l, int r, int ql, int qr, long long add) {       if (l > qr || r < ql) {         return;       }       if (ql <= l && r <= qr) {         apply(id, l, r, add);         return;       }       push(id, l, r);       int m = (l + r) >> 1;       rangeadd(id << 1, l, m, ql, qr, add);       rangeadd(id << 1 | 1, m + 1, r, ql, qr, add);       pull(id);     }     void rangeadd(int ql, int qr, long long add) {       rangeadd(1, 0, n - 1, ql, qr, add);     }   };   void solve() {     int N;     cin >> N;     vector<int> P(N), pos(N);     for (int i = 0; i < N; i++) {       cin >> P[i];       P[i]--;       pos[P[i]] = i;     }     vector<int> A(N);     for (int i = 0; i < N; i++) {       cin >> A[i];     }     vector<long long> init(N - 1);     for (int i = 0; i < N - 1; i++) {       init[i] = (i == 0 ? 0 : init[i - 1]) + A[i];     }     SegmentTree st(init);     long long ans = A[0];     for (int i = 0; i < N; i++) {       st.rangeadd(0, pos[i] - 1, A[pos[i]]);       st.rangeadd(pos[i], N - 2, -A[pos[i]]);       ans = min(ans, st.tree[1].mn);     }     cout << ans <<   n ;   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     int t = 1;     while (t--) solve();     return 0;   }   