#include <iostream>
#include <climits>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
struct Seg {
vector<int> t;
int n;
Seg(int N) {
n=N;
t = vector<int>(2*N,INT_MAX);
}
void Update(int loc, int v) {
loc+=n;
t[loc] = v;
loc = loc/2;
while(loc>0) {
t[loc] = min(t[2*loc],t[2*loc+1]);
loc = loc/2;
}
}
int Query(int l,int r) {
l+=n; r+=n;
int res = INT_MAX;
while(l!=r) {
res = min(res,t[l]);
if(l%2==1) {
l++;
}
if(r%2==1) {
r--;
}
res = min(res,t[r]);
l=l/2;
r=r/2;
}
return res;
}
};
int main()
{
int N,Q;
cin>>N>>Q;
vector<pair<pair<int,int>,int>> ev;
vector<pair<pair<int,int>,int>> u;
for (int i = 0; i < N; ++i) {
int x,y;
cin>>x>>y;
ev.emplace_back(make_pair(x,y),i);
}
sort(ev.begin(),ev.end(),[](pair<pair<int,int>,int> a, pair<pair<int,int>,int> b){return b.first.second>a.first.second;});
vector<int> intoev(N);
for (int i = 0; i < N; ++i) {
intoev[ev[i].second]=i;
u.emplace_back(make_pair(ev[i].first.first,0),i);
u.emplace_back(make_pair(ev[i].first.second,1),i);
}
sort(u.begin(),u.end());
vector<int> f(N);
set<pair<int,int>> s;
for (int i = 0; i < 2*N; ++i) {
auto [a,j] = u[i];
if(ev[j].first.first==a.first) {
s.insert({ev[j].first.second,j});
auto t = s.lower_bound({0,0});
if(t!=s.end()) {
f[j]=t->second;
}else f[j]=j;
}else {
s.erase({ev[j].first.second,j});
}
}
vector<pair<pair<int,int>,int>> req;
for (int i = 0; i < Q; ++i) {
int s,e;
cin>>s>>e; s--; e--;
req.emplace_back(make_pair(intoev[s],intoev[e]),i);
}
vector<int> ans(Q);
sort(req.begin(),req.end(),[](pair<pair<int,int>,int> a, pair<pair<int,int>,int> b){return b.first.second>a.first.second;});
int cureq = 0;
vector<pair<int,int>> intervals;
vector<int> achiv(N);
Seg seg = Seg(N);
for (int i = 0; i < N; ++i) {
if(f[i]==i) {
intervals.emplace_back(i,i);
seg.Update(i,i);
achiv[i]=i;
}else{
int tem = seg.Query(f[i],i);
achiv[i]=tem;
seg.Update(i,tem);
while(intervals.back().first>f[i]) intervals.pop_back();
if(intervals.back().first==f[i]) {
intervals.back().second = i;
}else {
intervals.back().second = f[i]-1;
intervals.emplace_back(f[i],i);
}
}
while(req[cureq].first.second==i) {
if(req[cureq].first.first==req[cureq].first.second) {
ans[req[cureq].second] = 0;
cureq++;
continue;
}
if(ev[req[cureq].first.first].first.second==ev[req[cureq].first.second].first.second) {
ans[req[cureq].second] = 1;
cureq++;
continue;
}
if(req[cureq].first.first<achiv[i]||req[cureq].first.first>req[cureq].first.second) {
ans[req[cureq].second] = -1;
cureq++;
continue;
}else{
int min = 0;
int max = intervals.size();
while(true) {
int mid = (max+min)/2;
if(req[cureq].first.first<intervals[mid].first) {
max = mid;
}else if(req[cureq].first.first>intervals[mid].second) {
min = mid+1;
}else {
ans[req[cureq].second] = intervals.size()-mid;
cureq++;
break;
}
}
}
}
}
for (int i = 0; i < Q; ++i) {
if(ans[i]==-1) {
cout<<"impossible"<<endl;
}else {
cout<<ans[i]<<endl;
}
}
}
Compilation message
events.cpp: In function 'int main()':
events.cpp:63:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
63 | auto [a,j] = u[i];
| ^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
199 ms |
9892 KB |
Output is correct |
3 |
Correct |
209 ms |
10044 KB |
Output is correct |
4 |
Correct |
209 ms |
10044 KB |
Output is correct |
5 |
Correct |
207 ms |
10040 KB |
Output is correct |
6 |
Correct |
214 ms |
13144 KB |
Output is correct |
7 |
Correct |
215 ms |
13080 KB |
Output is correct |
8 |
Incorrect |
205 ms |
13600 KB |
Output isn't correct |
9 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
1 ms |
348 KB |
Output is correct |
4 |
Correct |
1 ms |
348 KB |
Output is correct |
5 |
Correct |
1 ms |
496 KB |
Output is correct |
6 |
Incorrect |
1 ms |
348 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
1 ms |
348 KB |
Output is correct |
4 |
Correct |
1 ms |
348 KB |
Output is correct |
5 |
Correct |
1 ms |
496 KB |
Output is correct |
6 |
Incorrect |
1 ms |
348 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
1 ms |
348 KB |
Output is correct |
4 |
Correct |
1 ms |
348 KB |
Output is correct |
5 |
Correct |
1 ms |
496 KB |
Output is correct |
6 |
Incorrect |
1 ms |
348 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
198 ms |
10048 KB |
Output is correct |
2 |
Correct |
216 ms |
10104 KB |
Output is correct |
3 |
Correct |
214 ms |
10044 KB |
Output is correct |
4 |
Correct |
197 ms |
10428 KB |
Output is correct |
5 |
Correct |
211 ms |
10296 KB |
Output is correct |
6 |
Incorrect |
221 ms |
10356 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
199 ms |
9892 KB |
Output is correct |
3 |
Correct |
209 ms |
10044 KB |
Output is correct |
4 |
Correct |
209 ms |
10044 KB |
Output is correct |
5 |
Correct |
207 ms |
10040 KB |
Output is correct |
6 |
Correct |
214 ms |
13144 KB |
Output is correct |
7 |
Correct |
215 ms |
13080 KB |
Output is correct |
8 |
Incorrect |
205 ms |
13600 KB |
Output isn't correct |
9 |
Halted |
0 ms |
0 KB |
- |