Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define F first
- #define S second
- #define pb push_back
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace __gnu_pbds;
- #define ordered_set tree<pair<ll,int>, null_type,less<pair<ll,int>>, rb_tree_tag,tree_order_statistics_node_update>
- using namespace std;
- typedef long long ll;
- const int MOD = 1e9 + 7;
- const int mxP = 1e2 + 9;
- const int mxN = 1e5 + 9;
- const int INF = 1e7 + 7;
- const int mxK = 20;
- const double eps = 1e-7;
- ll A[mxN], dp[mxN], pre[mxN];
- vector <ll> idx[12];
- map <ll, ll> mp;
- ll get (vector <ll>& v, ll x) {
- int l = 0, r = v.size() - 1;
- while (l != r) {
- int mid = (l + r + 1) / 2;
- if (v[mid] <= x)
- l = mid;
- else r = mid - 1;
- }
- if (v[l] <= x)
- return v[l];
- return - 1;
- }
- ll flex (ll x) {
- return ((x % MOD) + MOD) % MOD;
- }
- void solve () {
- ll n;
- cin >> n;
- for (int i = 1; i <= n; i++)
- cin >> A[i];
- ll m;
- cin >> m;
- for (int i = 1; i <= m; i++) {
- ll x;
- cin >> x;
- mp[x] = i;
- }
- for (int i = 1; i <= n; i++) {
- if (mp.count(A[i])) {
- ll j = mp[A[i]];
- idx[j].pb (i);
- }
- }
- for (ll i = 1; i <= n; i++) {
- pre[i] = pre[i - 1] + A[i];
- dp[i] = max (A[i], dp[i - 1] + A[i]);
- }
- ll res = 0;
- for (ll i = 1; i <= n; i++) {
- ll L = n + 1;
- for (auto [x, j]: mp)
- L = min (L, get(idx[j], i));
- if (L == -1)
- continue;
- res = max (res, pre[i] - pre[L - 1] + max (dp[L - 1], 0ll));
- }
- cout << flex (res) << "\n";
- return;
- }
- int main () {
- int t = 1;
- //cin >> t;
- //preCalc ();
- while (t--)
- solve ();
- return 0;
- }
- /*
- 11
- 1 2 -2 -1 6 -2 7 1 2 4 -100
- 2
- 2 1
- * */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement