#include<bits/stdc++.h>
using namespace std;
#define task "a"
#define ll long long
#define ii pair<int, int>
#define fi first
#define se second
#define tp tuple<int, int, int>
const long mxN = 2e5 + 7, inf = 1e9 + 7;
struct T
{
int l, r, id;
};
priority_queue<tp, vector<tp>, greater<tp>> pq;
int n, tree[mxN * 4], pre[mxN], ans[mxN];
ii dp[mxN];
T a[mxN];
bool cmp(T u, T v)
{
return u.r < v.r;
}
void Build(int j = 1, int l = 1, int r = n)
{
if (l == r)
{
tree[j] = a[l].l;
return;
}
int mid = (l + r) / 2;
Build(j * 2, l, mid);
Build(j * 2 + 1, mid + 1, r);
tree[j] = min(tree[j * 2], tree[j * 2 + 1]);
}
void Upd(int val, int mn, int vt, int j = 1, int l = 1, int r = n)
{
if (a[r].r < vt || vt < tree[j])
return;
if (l == r)
{
mn = min(a[l].l, mn);
dp[a[l].id] = {val + 1, mn};
tree[j] = inf;
pq.push({val + 1, mn, a[l].id});
return;
}
int mid = (l + r) / 2;
Upd(val, mn, vt, j * 2, l, mid);
Upd(val, mn, vt, j * 2 + 1, mid + 1, r);
tree[j] = min(tree[j * 2], tree[j * 2 + 1]);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
// freopen(task".INP", "r", stdin);
// freopen(task".OUT", "w", stdout);
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i].l >> a[i].r;
a[i].id = i;
}
for (int id = 0; id <= 1; id++)
{
for (int i = 1; i <= n; i++)
dp[i].fi = inf;
sort(a + 1, a + n + 1, cmp);
Build();
pq.push({0, n, n});
while (pq.size())
{
auto [tmp, mn, j] = pq.top();
pq.pop();
Upd(tmp, mn, j);
}
if (!id)
{
pre[0] = inf;
for (int i = 1; i <= n; i++)
pre[i] = min(pre[i - 1], dp[i].fi);
pre[n] = 0;
}
else
{
for (int i = 1; i <= n; i++)
{
int j = n + 1 - i;
ans[j] = dp[i].fi + pre[n + 1 - dp[i].se];
}
}
for (int i = 1; i <= n; i++)
{
a[i].l = n + 1 - a[i].l;
a[i].r = n + 1 - a[i].r;
swap(a[i].l, a[i].r);
a[i].id = n + 1 - a[i].id;
}
}
for (int id = 0; id <= 1; id++)
{
for (int i = 1; i <= n; i++)
{
a[i].l = n + 1 - a[i].l;
a[i].r = n + 1 - a[i].r;
swap(a[i].l, a[i].r);
a[i].id = n + 1 - a[i].id;
}
for (int i = 1; i <= n; i++)
dp[i].fi = inf;
sort(a + 1, a + n + 1, cmp);
Build();
pq.push({0, n, n});
while (pq.size())
{
auto [tmp, mn, j] = pq.top();
pq.pop();
Upd(tmp, mn, j);
}
if (!id)
{
pre[0] = inf;
for (int i = 1; i <= n; i++)
pre[i] = min(pre[i - 1], dp[i].fi);
pre[n] = 0;
}
else
{
for (int i = 1; i <= n; i++)
{
int j = n + 1 - i;
ans[i] = dp[i].fi + pre[n + 1 - dp[i].se];
}
}
}
int q;
cin >> q;
for (int i = 1; i <= q; i++)
{
int tmp;
cin >> tmp;
if (ans[tmp] >= inf)
cout << -1 << '\n';
else
cout << ans[tmp] << '\n';
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |