#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
const int M = 25;
const int INF = 0x3f3f3f3f;
int n, q;
int d[N], c[N];
int fa[N], depth[N];
int f[N][M], g[N][M];
int h[N], ne[N], e[N], idx;
void bfs() {
queue<int> Q;
Q.push(n + 1);
memset(depth, 0x3f, sizeof depth);
depth[n + 1] = 1;
while (Q.size()) {
int t = Q.front(); Q.pop();
for (int i = h[t]; ~i; i = ne[i]) {
int j = e[i];
if (depth[j] > depth[t] + 1) {
depth[j] = depth[t] + 1;
Q.push(j);
f[j][0] = t; g[j][0] = c[t];
for (int k = 1;(1 << k) <= depth[j]; k ++ ) f[j][k] = f[f[j][k - 1]][k - 1], g[j][k] = g[f[j][k - 1]][k - 1] + g[j][k - 1];
}
}
}
}
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
int query(int r, int v) {
if (v <= c[r]) return r;
v -= c[r];
int now = r;
for (int i = 20; i >= 0; i -- ) {
if (v >= g[now][i] && (1 << i) <= depth[now]) {
v -= g[now][i];
now = f[now][i];
}
}
if (v > 0) now = f[now][0];
if (now == n + 1) return 0;
else return now;
}
signed main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i ++ ) {
cin >> d[i] >> c[i];
}
stack<int> stk;
stk.push(1);
d[n + 1] = INF;
for (int i = 2; i <= n + 1; i ++ ) {
while (!stk.empty() && d[i] > d[stk.top()]) fa[stk.top()] = i, stk.pop();
stk.push(i);
}
memset(h, -1, sizeof h);
for (int i = 1; i <= n; i ++ ) add(fa[i], i);
bfs();
while (q -- ) {
int r, v;
cin >> r >> v;
cout << query(r, v) << '\n';
}
return 0;
}