贪心,倍增优化n至log(n)
#include<iostream> #include<cstdio> #define ri register int #define u int namespace opt { inline u in() { u x(0),f(1); char s(getchar()); while(s<'0'||s>'9') { if(s=='-') f=-1; s=getchar(); } while(s>='0'&&s<='9') { x=(x<<1)+(x<<3)+s-'0'; s=getchar(); } return x*f; } } using opt::in; #define NN 500005 #include<algorithm> #include<cmath> namespace mainstay { u N,M,mx,f[NN][30]; inline void solve() { N=in(),M=in(); for(ri i(1); i<=N; ++i) { u _a(in()),_b(in()); f[_a][0]=std::max(f[_a][0],_b); mx=std::max(mx,_b); } for(ri i(1); i<=mx; ++i) { f[i][0]=std::max(f[i][0],f[i-1][0]); } for(ri j(1); j<=20; ++j) { for(ri i(0); i<=mx; ++i) { f[i][j]=f[f[i][j-1]][j-1]; } } for(ri i(1); i<=M; ++i) { u _a(in()),_b(in()),_ans(0); for(ri j(20); j>=0; --j) { if(f[_a][j]<_b) { _ans+=(1<<j); _a=f[_a][j]; } } printf("%d ",f[_a][0]>=_b?_ans+1:-1); } } } int main() { //freopen("x.txt","r",stdin); std::ios::sync_with_stdio(false); mainstay::solve(); }