/* 不要低头,不要放弃,不要气馁,不要慌张 题意: n天进行m科考试,每科考试需要a的复习时间,n天每天最多可以考一科。并且指定哪天考哪科。 注意考试那天不能复习。 问最少需要多少天可全部通过考试。 思路: 转化为判定性问题。二分天数。 然后贪心,在规定天数以内,最后一天通过即可。需要保证每一科最后一天之前剩下还没考试的科目都来得及复习。(同时注意要要加上考试时间) 最后还要判定是不是所有的科目都通过了。 */ #include<bits/stdc++.h> using namespace std; long long a[100050],b[100050],sum; int n,m; bool pf(int la){ set<int>mm; long long tt=sum; for(int i=la;i>=1;i--){ if(a[i]){ if(mm.find(a[i])==mm.end()){ int gg=mm.size(); if(tt+m-gg<=i){ mm.insert(a[i]); tt-=b[a[i]]; } else return 0; } } } if(!tt)return 1; else return 0; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%lld",a+i); for(int i=1;i<=m;i++)scanf("%lld",b+i); for(int i=1;i<=m;i++)sum+=b[i]; int l=1,r=n; while(l<=r){ int mid=(l+r)>>1; if(pf(mid))r=mid-1; else l=mid+1; } if(l>n)puts("-1"); else printf("%d\n",l); }