#pragma GCC optimize ("Ofast") #include using namespace std; inline void rd(int &x){ int k; int m=0; x=0; for(;;){ k = getchar_unlocked(); if(k=='-'){ m=1; break; } if('0'<=k&&k<='9'){ x=k-'0'; break; } } for(;;){ k = getchar_unlocked(); if(k<'0'||k>'9'){ break; } x=x*10+k-'0'; } if(m){ x=-x; } } inline void rd(long long &x){ int k; int m=0; x=0; for(;;){ k = getchar_unlocked(); if(k=='-'){ m=1; break; } if('0'<=k&&k<='9'){ x=k-'0'; break; } } for(;;){ k = getchar_unlocked(); if(k<'0'||k>'9'){ break; } x=x*10+k-'0'; } if(m){ x=-x; } } inline void wt_L(char a){ putchar_unlocked(a); } inline void wt_L(int x){ int s=0; int m=0; char f[10]; if(x<0){ m=1; x=-x; } while(x){ f[s++]=x%10; x/=10; } if(!s){ f[s++]=0; } if(m){ putchar_unlocked('-'); } while(s--){ putchar_unlocked(f[s]+'0'); } } template inline S chmax(S &a, T b){ if(a ok1; set ok2; priority_queue< pair > q; int res[100000]; int main(){ int i; int j; int k; int x; int y; int z; long long tm; rd(N); rd(K1);K1 += (-1); rd(K2);K2 += (-1); rd(Q); { int Lj4PdHRW; for(Lj4PdHRW=(0);Lj4PdHRW<(Q);Lj4PdHRW++){ rd(A[Lj4PdHRW]); rd(B[Lj4PdHRW]); } } k = 0; if(K1 < K2){ while(K1 >= 0 || K2 < N){ if(K1 >= 0){ ind[k++] = K1--; } if(K2 < N){ ind[k++] = K2++; } } } else{ while(K1 < 0 || K2 >= N){ if(K1 < N){ ind[k++] = K1++; } if(K2 >= 0){ ind[k++] = K2--; } } } for(i=(0);i<(N);i++){ cnv[ind[i]] = i; } for(i=(0);i<(N);i++){ nx[cnv[i]][0] = nx[cnv[i]][1] = -1; if(i-1 >= 0){ nx[cnv[i]][0] = cnv[i-1]; } if(i+1 < N){ nx[cnv[i]][1] = cnv[i+1]; } } for(i=(0);i<(N);i++){ ok1.insert(i); } for(i=(0);i<(N);i++){ ok2.insert(i); } tm = 0; for(k=(0);k<(Q);k++){ chmax(tm, A[k]); while(ok1.size()==0 || (q.size() && -q.top().first <= tm)){ chmax(tm, -q.top().first); i = q.top().second; q.pop(); ok1.insert(i); for(z=(0);z<(3);z++){ x = i; if(z < 2){ x = nx[i][z]; } if(x==-1){ continue; } if(ok1.count(x)==0){ continue; } if((nx[x][0]==-1 || ok1.count(nx[x][0])==1) && (nx[x][1]==-1 || ok1.count(nx[x][1])==1)){ ok2.insert(x); } } } if(ok2.size()){ i = *ok2.begin(); } else{ i = *ok1.begin(); } q.push( make_pair(-(tm + B[k]), i) ); res[k] = i; ok1.erase(i); for(z=(0);z<(3);z++){ x = i; if(z < 2){ x = nx[i][z]; } if(x==-1){ continue; } if(ok2.count(x)){ ok2.erase(x); } } } for(i=(0);i<(Q);i++){ wt_L(ind[res[i]] + 1); wt_L('\n'); } return 0; } // cLay varsion 20191214-1 // --- original code --- // int N, K1, K2; // int Q; ll A[1d5], B[1d5]; // // int ind[1d5], cnv[1d5], nx[1d5][2]; // set ok1, ok2; // // priority_queue< pair > q; // int res[1d5]; // // { // int i, j, k, x, y, z; // ll tm; // rd(N,K1--,K2--,Q,(A,B)(Q)); // // k = 0; // if(K1 < K2){ // while(K1 >= 0 || K2 < N){ // if(K1 >= 0) ind[k++] = K1--; // if(K2 < N) ind[k++] = K2++; // } // } else { // while(K1 < 0 || K2 >= N){ // if(K1 < N) ind[k++] = K1++; // if(K2 >= 0) ind[k++] = K2--; // } // } // // rep(i,N) cnv[ind[i]] = i; // rep(i,N){ // nx[cnv[i]][0] = nx[cnv[i]][1] = -1; // if(i-1 >= 0) nx[cnv[i]][0] = cnv[i-1]; // if(i+1 < N) nx[cnv[i]][1] = cnv[i+1]; // } // // rep(i,N) ok1.insert(i); // rep(i,N) ok2.insert(i); // // tm = 0; // rep(k,Q){ // tm >?= A[k]; // while(ok1.size()==0 || (q.size() && -q.top().first <= tm)){ // tm >?= -q.top().first; // i = q.top().second; // q.pop(); // ok1.insert(i); // rep(z,3){ // x = i; // if(z < 2) x = nx[i][z]; // if(x==-1) continue; // if(ok1.count(x)==0) continue; // if((nx[x][0]==-1 || ok1.count(nx[x][0])==1) && (nx[x][1]==-1 || ok1.count(nx[x][1])==1)) ok2.insert(x); // } // } // // if(ok2.size()) i = *ok2.begin(); // else i = *ok1.begin(); // // q.push( make_pair(-(tm + B[k]), i) ); // // res[k] = i; // ok1.erase(i); // rep(z,3){ // x = i; // if(z < 2) x = nx[i][z]; // if(x==-1) continue; // if(ok2.count(x)) ok2.erase(x); // } // } // // rep(i,Q) wt(ind[res[i]] + 1); // }