#include #include #include using namespace std; #define log2 Log2 const int MAXN = 100000 + 10; const int MAXLOGN = 20; const int INF = 1000000000; struct Segment { int left, right; Segment () { } Segment (int left_, int right_) : left(left_), right(right_) { } bool operator < (const Segment& you) const { return right < you.right; } }; Segment a[MAXN]; int sparseTable[MAXLOGN + 5][MAXN]; int jump[MAXLOGN + 5][MAXN]; int log2[MAXN]; int n; int q; int getMaxL (int l, int r) { return max(sparseTable[log2[r - l + 1]][l], sparseTable[log2[r - l + 1]][r - (1 << log2[r - l + 1]) + 1]); } int jumpTill (int pos, int bound) { int ret = 1; for(int i = 20; i >= 0; i--) if (a[jump[i][pos]].right <= bound) { ret += (1 << i); pos = jump[i][pos]; } return ret; } int main(int argc, const char * argv[]) { // freopen("input.txt", "r", stdin); cin >> n >> q; assert(1 <= n && n <= 100000); assert(1 <= q && q <= 100000); for(int i = 1; i <= n; i++) { cin >> a[i].left >> a[i].right; assert(1 <= a[i].left && a[i].left <= a[i].right && a[i].right <= 1000000); } sort(a + 1, a + n + 1); a[n + 1] = Segment(INF, INF); for(int i = 1; i <= n + 1; i++) sparseTable[0][i] = a[i].left; log2[1] = 0; for(int i = 2; i <= n + 1; i++) log2[i] = 1 + log2[i >> 1]; for(int i = 1; i <= MAXLOGN; i++) for(int j = 1; j <= n - (1 << i) + 2; j++) { sparseTable[i][j] = max(sparseTable[i - 1][j], sparseTable[i - 1][j + (1 << (i - 1))]); } jump[0][n + 1] = n + 1; for(int i = 1; i <= n; i++) { int left = i, right = n + 1; while (left < right) { int middle = (left + right) / 2; if (getMaxL(i, middle) > a[i].right) right = middle; else left = middle + 1; } jump[0][i] = left; } for(int i = 1; i <= MAXLOGN; i++) for(int j = 1; j <= n + 1; j++) { jump[i][j] = jump[i - 1][jump[i - 1][j]]; } while (q--) { int l, r; cin >> l >> r; assert(1 <= l && l <= r && r <= 1000000); int pos = (int)(lower_bound(a + 1, a + n + 1, Segment(l, l)) - a); if (a[pos].right > r) { cout << 0 << endl; continue; } int left = pos, right = n + 1; while (left < right) { int middle = (left + right) / 2; if (getMaxL(pos, middle) >= l) right = middle; else left = middle + 1; } if (left == n + 1 || a[left].right > r) cout << 0 << endl; else cout << jumpTill(left, r) << endl; } return 0; }