Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef vector<int> vi;
- typedef pair<int, int> pii;
- #define ff first
- #define ss second
- #define y1 y111
- #define X first
- #define Y second
- #define mk make_pair
- #define inb push_back
- #define all(v) v.begin(), v.end()
- const int MAXN = (int)1e6 + 9, MAXN1 = (int)2e4 + 7;
- const int INFint = (int)1e9 + 7, P = 31;
- const ll INFll = (ll)1e18 + 7, MOD = (ll)1e9 + 7;
- const double INFfl = 1e18 * 4 + 7;
- const double EPS = 1e-7;
- const double PI = atan2(0, -1);
- int solve();
- int main()
- {
- #define TASK ""
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
- #else
- //freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
- #endif
- solve();
- }
- const int STRBUF = (int)1e6 + 7;
- char buf[STRBUF];
- string get_str()
- {
- scanf(" %s", buf);
- return string(buf);
- }
- int solve()
- {
- int n, m;
- scanf("%d %d", &n, &m);
- vi d(n), a(n);
- for (int i = 0; i < n; ++i)
- scanf("%d", &d[i]), --d[i];
- for (int i = 0; i < m; ++i)
- scanf("%d", &a[i]);
- int l = -1, r = n;
- auto check = [&](int x)
- {
- vector<pii> lst(m, mk(-1, 0));
- for (int i = 0; i < m; ++i)
- lst[i].Y = i;
- for (int i = 0; i < x; ++i)
- {
- if (d[i] != -1)
- lst[d[i]].X = i;
- }
- sort(all(lst));
- if (lst[0].X == -1)
- return 0;
- int bds = 0;
- for (int i = 0; i < m; ++i)
- {
- int id = lst[i].Y;
- if (bds + a[id] <= lst[i].X)
- bds += a[id] + 1;
- else
- return 0;
- }
- return 1;
- };
- while (r - l > 1)
- {
- int mid = l + r >> 1;
- if (check(mid))
- r = mid;
- else
- l = mid;
- }
- if (!check(r))
- puts("-1"), exit(0);
- printf("%d\n", r);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement