using System; using static System.Console; using System.Linq; using System.Collections.Generic; using System.Runtime.Intrinsics.Arm; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray(); public static void Main() { Solve(); } static void Solve() { var c = NList; var (n, k1, k2) = (c[0], c[1] - 1, c[2] - 1); var q = NN; var map = NArr(q); WriteLine(string.Join("\n", Seat(n, k1, k2, q, map))); } static int[] Seat(int n, int k1, int k2, int q, int[][] map) { var pos = new int[n]; pos[0] = k1; var flag = k2 - k1; var tmp = 1; for (var d = 1; d < n; ++d) { var dn = k1 + d * flag; if (dn >= 0 && dn < n) { pos[tmp] = dn; ++tmp; } var df = k1 - d * flag; if (df >= 0 && df < n) { pos[tmp] = df; ++tmp; } } var order = new int[n]; for (var i = 0; i < n; ++i) order[pos[i]] = i; var cond = Enumerable.Repeat(true, n).ToArray(); var sit = new bool[n]; var ret = new PriorityQueue<(int order, long time), long>(); var pq1 = new PriorityQueue(); for (var i = 0; i < n; ++i) pq1.Enqueue(i, i); var pq2 = new PriorityQueue(); var ans = new int[q]; var ctime = 0L; for (var i = 0; i < q; ++i) { ctime = Math.Max(ctime, map[i][0]); while ((ret.Count > 0 && ret.Peek().time <= ctime) || ret.Count == n) { var (eorder, etime) = ret.Dequeue(); ctime = Math.Max(ctime, etime); var epos = pos[eorder]; sit[epos] = false; cond[epos] = IsFirst(n, epos, sit); if (cond[epos]) pq1.Enqueue(eorder, eorder); else pq2.Enqueue(eorder, eorder); if (epos > 0 && !sit[epos - 1]) { cond[epos - 1] = IsFirst(n, epos - 1, sit); if (cond[epos - 1]) pq1.Enqueue(order[epos - 1], order[epos - 1]); else pq2.Enqueue(order[epos - 1], order[epos - 1]); } if (epos + 1 < n && !sit[epos + 1]) { cond[epos + 1] = IsFirst(n, epos + 1, sit); if (cond[epos + 1]) pq1.Enqueue(order[epos + 1], order[epos + 1]); else pq2.Enqueue(order[epos + 1], order[epos + 1]); } } var flg = false; while (pq1.Count > 0) { var iorder = pq1.Dequeue(); var ipos = pos[iorder]; if (!sit[ipos] && cond[ipos]) { ret.Enqueue((iorder, ctime + map[i][1]), ctime + map[i][1]); ans[i] = ipos + 1; flg = true; sit[ipos] = true; if (ipos - 1 >= 0 && !sit[ipos - 1] && cond[ipos - 1]) { cond[ipos - 1] = false; pq2.Enqueue(order[ipos - 1], order[ipos - 1]); } if (ipos + 1 < n && !sit[ipos + 1] && cond[ipos + 1]) { cond[ipos + 1] = false; pq2.Enqueue(order[ipos + 1], order[ipos + 1]); } break; } } if (!flg) { while (true) { var iorder = pq2.Dequeue(); var ipos = pos[iorder]; if (!sit[ipos] && !cond[ipos]) { ret.Enqueue((iorder, ctime + map[i][1]), ctime + map[i][1]); ans[i] = ipos + 1; sit[ipos] = true; if (ipos - 1 >= 0 && !sit[ipos - 1] && cond[ipos - 1]) { cond[ipos - 1] = false; pq2.Enqueue(order[ipos - 1], order[ipos - 1]); } if (ipos + 1 < n && !sit[ipos + 1] && cond[ipos + 1]) { cond[ipos + 1] = false; pq2.Enqueue(order[ipos + 1], order[ipos + 1]); } break; } } } } return ans; } static bool IsFirst(int n, int seat, bool[] sit) { if (seat == 0) return !sit[seat] && !sit[seat + 1]; if (seat + 1 == n) return !sit[seat - 1] && !sit[seat]; return !sit[seat - 1] && !sit[seat] && !sit[seat + 1]; } }