Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //#include<bits/stdc++.h>
- #include<iostream>
- #include<vector>
- #include<fstream>
- #include<algorithm>
- #define long long long
- #define nln '\n'
- const long N = 2*1e5+10;
- using namespace std;
- // GLobal variables: n, h, a
- fstream f1;
- long n;
- vector<long> h, a;
- void data()
- {
- f1.open("flowers.inp", ios:: in);
- cin >> n;
- h.resize(n+1, 0);
- a.resize(n+1, 0);
- for (long i = 1; i <= n; ++i)
- cin >> h[i];
- for (long i = 1; i <= n; ++i)
- cin >> a[i];
- f1.close();
- }
- vector<long> tre;
- long get(long id, long lef, long rig, long i, long j)
- {
- if (lef > j || rig < i)
- return 0;
- if (lef == rig || (lef >= i && rig <=j))
- return tre[id];
- long mid = (lef + rig)/2;
- return max(get(id*2, lef, mid, i, j), get(id*2+1, mid+1, rig, i, j));
- }
- void update(long id, long lef, long rig, long hig, long beu)
- {
- if (lef == rig)
- {
- tre[id] = beu;
- return;
- }
- long mid = (lef+rig)/2;
- if (hig <= mid)
- update(id*2, lef, mid, hig, beu);
- else
- update(id*2+1, mid+1, rig, hig, beu);
- tre[id] = max(tre[id*2], tre[id*2+1]);
- }
- void process()
- {
- tre.resize(n*4+1, 0);
- for (long k = 1; k <= n; ++k)
- {
- long mav = get(1, 1, n, 1, h[k]-1);
- update(1, 1, n, h[k], mav+a[k]);
- }
- cout << tre[1] << nln;
- }
- int main()
- {
- data();
- process();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment