#include<bits/stdc++.h>
using namespace std;
int st[400020];
void update(int node, int l, int r, int p, int v)
{
if(l > p || r < p) return;
if(l == p && r == p) st[node] = max(st[node], v);
else{
update(node*2, l, (l+r)/2, p, v);
update(node*2+1, (l+r)/2+1, r, p, v);
st[node] = max(st[node*2], st[node*2+1]);
}
}
int query(int node, int l, int r, int tl, int tr)
{
if(l > tr || r < tl) return 0;
if(l >= tl && r <= tr) return st[node];
else return max(query(node*2, l, (l+r)/2, tl, tr), query(node*2+1, (l+r)/2+1, r, tl, tr));
}
pair<int, int> a[100005];
int b[100005], c[100005], dp[100005];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, m; cin>>n>>m;
for(int i = 1; i <= n; i++){
cin>>a[i].first>>a[i].second;
swap(a[i].first, a[i].second);
}
for(int i = 1; i <= m; i++) cin>>c[i];
for(int i = 1; i <= n; i++){
a[i].second *= -1; c[i] *= -1; a[i].first *= -1;
}
sort(a+1, a+n+1); sort(c+1, c+m+1);
vector<int> vec;
for(int i = 1; i <= n; i++) vec.push_back(a[i].second);
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
for(int i = 1; i <= n; i++) b[i] = upper_bound(vec.begin(), vec.end(), a[i].second) - vec.begin();
int ans = 0;
for(int i = 1; i <= n; i++){
int p1 = upper_bound(c+1, c+m+1, a[i].second) - c - 1;
int p2 = query(1, 1, n, 1, b[i])+1;
dp[i] = min(p1, p2); ans = max(ans, dp[i]);
update(1, 1, n, b[i], dp[i]);
}
cout<<ans;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |