#include <bits/stdc++.h>
#define int long long
#define vi vector<int>
#define ii pair<int, int>
#define f first
#define s second
#define all(x) (x).begin(), (x).end()
#define P 31
#define mod 1'000'000'007
#define inf 1'000'000'000'000
#define pb push_back
#define str string
#define sz(x) (x).size()
#define vvi vector<vi>
#define fun function
#define oopt cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(false);
#define file freopen("problemname.in", "r", stdin); freopen("pr.out", "w", stdout);
#define dbg(v) cout << "Line(" << __LINE__ << ") -> " << #v << " = " << (v) << endl;
using namespace std;
template <class T, int SZ> using arr = array<T, SZ>;
struct slika
{
int vl, vr;
};
slika a[200005];
int b[200005];
int opcije[200005];
signed main()
{
oopt;
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++)
cin >> a[i].vl >> a[i].vr;
sort(a, a+n, [](slika&p, slika&d){
if (p.vr == d.vr)
return p.vl < d.vl;
return p.vr < d.vr;
});
// cout << m << "\n";
for (int i = 0; i < m; i++)
cin >> b[i];
sort(b, b+m);
set<int> st;
for (int i = 0; i < m+1; i++)
st.insert(i);
for (int i = 0; i < n; i++)
{
int l = -1, r = m;
while (l+1 < r)
{
int mid = (l+r)/2;
if (b[mid] >= a[i].vl)
r = mid;
else
l=mid;
}
int pravi = r;
if (st.count(pravi) == 0)
{
st.insert(pravi);
auto it = st.find(pravi);
it++;
st.erase(pravi);
pravi = *it;
if (pravi < m)
st.erase(pravi);
}
else if (pravi < m)
st.erase(pravi);
opcije[i] = pravi;
}
vi lis;
for (int i = 0; i < n; i++)
{
if (opcije[i] >= m)
continue;
if (lis.empty() || opcije[i] >= lis.back())
lis.pb(opcije[i]);
else
{
int l = -1, r = lis.size();
while (l+1<r)
{
int mid = (l+r)/2;
if (lis[mid] >= opcije[i])
r = mid;
else
l=mid;
}
lis[r] = opcije[i];
}
}
cout << min((int)lis.size(), m) << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |