#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 Stopwatch { clock_t t = clock(); void restart() { t = clock(); } int elapsed() const { return (clock() - t) * 1000 / CLOCKS_PER_SEC; } friend string to_string(Stopwatch sw) { return "Time: " + to_string(sw.elapsed()) + " ms"; } } sw; template Z rng(Z l, Z r) { static mt19937 mt(chrono::steady_clock::now().time_since_epoch().count()); return uniform_int_distribution(l, r - 1)(mt); } 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(i2p[i]); } vector res(q, -1); set que; long long t = 0; auto add = [&](int id) { if (sw.elapsed() < 1500 and rng(0, 1000) == 0) { vector used(n, true); for (int p : se0) { int i = p2i[p]; assert(used[i]); used[i] = false; } for (int p : se1) { int i = p2i[p]; assert(used[i]); used[i] = false; } for (int p : se0) { int i = p2i[p]; assert(i == 0 or not used[i - 1]); assert(i == n - 1 or not used[i + 1]); } for (int p : se1) { int i = p2i[p]; assert( (i and used[i - 1]) or (i + 1 < n and used[i + 1]) ); } } int p = -1; if (not se0.empty()) { p = *begin(se0); } else if (not se1.empty()) { p = *begin(se1); } else { que.insert(id); } if (p == -1) { return; } int i = p2i[p]; res[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, id, t + b[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.id); } 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.t < pq.top().t) { while (not que.empty()) { int id = *begin(que); assert(res[id] == -1); add(id); if (res[id] == -1) { break; } que.erase(id); } } } } for (int e : res) { cout << e + 1 << '\n'; } }