Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int N = 2e5 + 100;
- /**
- 1) Add X in a range
- 2) query for min in a range
- **/
- long long inf = 1e18;
- long long tr[4*N], lz[4*N];
- void propagate(int u, int st, int en) {
- if (!lz[u]) return;
- tr[u] += lz[u];
- if (st!=en) {
- lz[2*u] += lz[u];
- lz[2*u+1] += lz[u];
- }
- lz[u] = 0;
- }
- void update(int u, int st, int en, int l, int r, long long x) {
- propagate(u, st, en);
- if (r<st || en<l || l > r) return;
- else if (l<=st && en<=r) {
- lz[u] += x;
- propagate(u, st, en);
- }
- else {
- int mid = (st+en)/2;
- update(2*u, st, mid, l, r, x);
- update(2*u+1, mid+1, en, l, r, x);
- tr[u] = min(tr[2*u], tr[2*u+1]);
- }
- }
- long long query(int u, int st, int en, int l, int r) {
- propagate(u, st, en);
- if (r<st || en<l) return inf;
- else if (l<=st && en<=r) return tr[u];
- else {
- int mid = (st+en)/2;
- return min(query(2*u, st, mid, l, r), query(2*u+1, mid+1, en, l, r));
- }
- }
- int a[N], pos[N], cost[N];
- int main() {
- int n;
- cin >> n;
- for(int i = 1; i <= n; i++) {
- cin >> a[i];
- pos[a[i]] = i;
- }
- for(int i = 1; i <= n; i++) {
- cin >> cost[i];
- }
- for(int i = 1; i <= n; i++) {
- update(1,1,n,pos[i],n,+cost[pos[i]]);
- }
- long long ans = query(1,1,n,1,n-1);
- for(int i = 1; i <= n; i++) {
- update(1,1,n,pos[i],n,-cost[pos[i]]);
- update(1,1,n,1,pos[i]-1,+cost[pos[i]]);
- ans = min(ans, query(1,1,n,1,n-1));
- }
- cout << ans << endl;
- }
Add Comment
Please, Sign In to add comment