#include <bits/stdc++.h>
#define to(i) edge[i].to
#define next(i) edge[i].next
using namespace std;
const int N = 1e5 + 2;
struct Edge{
int to;
int next;
}edge[N];
int n, cnt, d[N], c[N], head[N], dep[N], lg[N], p[N][17], dist[N][17];
void add_edge(int u, int v){
to(++cnt) = v;
next(cnt) = head[u];
head[u] = cnt;
}
void init(){
queue<int> q;
for (int i = 2; i <= n; i++)
lg[i] = lg[i >> 1] + 1;
q.push(n + 1);
while (!q.empty()){
int u = q.front();
q.pop();
for (int i = head[u]; i; i = next(i)){
int v = to(i);
dep[v] = dep[u] + 1;
p[v][0] = u, dist[v][0] = c[v];
for (int k = 1; k <= lg[dep[v]]; k++){
p[v][k] = p[p[v][k - 1]][k - 1];
dist[v][k] = dist[v][k - 1] + dist[p[v][k - 1]][k - 1];
}
q.push(v);
}
}
}
int query(int r, int v){
for (int i = lg[dep[r]]; i >= 0; i--)
if (v > dist[r][i]) v -= dist[r][i], r = p[r][i];
return r <= n ? r : 0;
}
int main(){
int q;
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i++)
scanf("%d%d", &d[i], &c[i]);
d[n + 1] = c[n + 1] = 0x7F7F7F7F;
stack<int> st;
for (int i = 1; i <= n + 1; i++){
while (!st.empty() && d[i] > d[st.top()])
add_edge(i, st.top()), st.pop();
st.push(i);
}
init();
while (q--){
int r, v;
scanf("%d%d", &r, &v);
printf("%d\n", query(r, v));
}
return 0;
}