#include using namespace std; string to_string(string s) { return '"' + s + '"'; } string to_string(bool b) { return b ? "true" : "false"; } template string to_string(bitset bs) { string res; for (size_t i = 0; i < N; ++i) res += '0' + bs[i]; return res; } string to_string(vector v) { string res = "{"; for (bool e : v) res += to_string(e) + ", "; return res += "}"; } template string to_string(pair p); template string to_string(C c) { string res = "{"; for (auto e : c) res += to_string(e) + ", "; return res += "}"; } template string to_string(pair p) { return "(" + to_string(p.first) + ", " + to_string(p.second) + ")"; } void debug() { cerr << '\n'; } template void debug(Head head, Tail... tail) { cerr << ' ' << to_string(head), debug(tail...); } #ifdef LOCAL #define DEBUG(...) cerr << "[" << #__VA_ARGS__ << "]:", debug(__VA_ARGS__) #else #define DEBUG(...) #endif struct Event { int type, id; long long t; bool operator<(Event r) const { return make_pair(t, -type) < make_pair(r.t, -r.type); }; bool operator>(Event r) const { return r < *this; } friend string to_string(Event e) { return "(" + to_string(e.type) + ", " + to_string(e.id + 1) + ", " + to_string(e.t) + ")"; } }; int main() { cin.tie(nullptr); ios::sync_with_stdio(false); int n, k0, k1; cin >> n >> k0 >> k1; --k0, --k1; vector i2p(n); if (k0 < k1) { int t = 1; for (int i = 1; i < n; ++i) { if (k0 + i < n) { i2p[k0 + i] = t++; } if (k0 - i >= 0) { i2p[k0 - i] = t++; } } } else { int t = 1; for (int i = 1; i < n; ++i) { if (k0 - i >= 0) { i2p[k0 - i] = t++; } if (k0 + i < n) { i2p[k0 + i] = t++; } } } vector p2i(n); for (int i = 0; i < n; ++i) { p2i[i2p[i]] = i; } int q; cin >> q; priority_queue< Event, vector, greater > pq; vector b(q); for (int i = 0; i < q; ++i) { int a; cin >> a >> b[i]; pq.emplace(Event{0, i, a}); } DEBUG(i2p); set se0, se1; for (int i = 0; i < n; ++i) { se0.insert(i); } vector res(q, -1); queue que; long long t = 0; auto add = [&](auto e) { int p = -1; if (not se0.empty()) { p = *begin(se0); } else if (not se1.empty()) { p = *begin(se1); } else { que.push(e); } if (p == -1) { return; } int i = p2i[p]; res[e.id] = i; if (i and se0.count(i2p[i - 1])) { se0.erase(i2p[i - 1]); se1.insert(i2p[i - 1]); } se0.erase(i2p[i]); if (i + 1 < n and se0.count(i2p[i + 1])) { se0.erase(i2p[i + 1]); se1.insert(i2p[i + 1]); } se1.erase(i2p[i]); pq.emplace(Event{1, e.id, t + b[e.id]}); }; while (not pq.empty()) { auto e = pq.top(); DEBUG(e); DEBUG(se0); DEBUG(se1); pq.pop(); t = e.t; if (e.type == 0) { add(e); } else { auto chk = [&](int i) { if (i - 1 >= 0 and not se0.count(i2p[i - 1]) and not se1.count(i2p[i - 1])) { return false; } if (i + 1 < n and not se0.count(i2p[i + 1]) and not se1.count(i2p[i + 1])) { return false; } return true; }; int i = res[e.id]; if (chk(i)) { se0.insert(i2p[i]); } else { se1.insert(i2p[i]); } for (int j : {i - 1, i + 1}) { if (j < 0 or j >= n) { continue; } if (se1.count(i2p[j]) and chk(j)) { se1.erase(i2p[j]); se0.insert(i2p[j]); } } DEBUG(se0); DEBUG(se1); if (pq.empty() or e < pq.top()) { while (not que.empty()) { // if (t == 50 and se0.size() == 2 and se1.size() == 2) { // cerr << "found" << '\n'; // cerr << res[que.front().id] << '\n'; // DEBUG(se0, se1); // } if (res[que.front().id] != -1) { que.pop(); continue; } add(que.front()); if (res[que.front().id] == -1) { break; } que.pop(); } } } } for (int e : res) { cout << e + 1 << '\n'; } }