#include #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma warning(disable:4996) typedef long long ll; #define MIN(a, b) ((a)>(b)? (b): (a)) #define MAX(a, b) ((a)<(b)? (b): (a)) #define LINF 9223300000000000000 #define INF 2140000000 const long long MOD = 1000000007; //const long long MOD = 998244353; using namespace std; void update(set& s0, set& s1, int q, int pt) { if(pt==0) s0.insert(q); else s0.erase(q); if(pt==1 || pt==2) s1.insert(q); else s1.erase(q); } int main(int argc, char* argv[]) { int n,K1,K2,Q; scanf("%d%d%d%d", &n, &K1, &K2, &Q); K1--; K2--; int i; vector vv; // vv[i]:i番目の優先順位番号の席のID(0<=i=0 && tmp=0 && tmp vv2(n); // vvの逆変換 for(i=0; i > > z; // time,flag(1:add, 0:del),id vector a(Q),b(Q); for(i=0; i pt(n); // 各席のpoint:その席に座っている人がいたら+10、隣りに座っている人がいたら+1 vector status(Q); // 各人が座った席(>=0) -1なら待機中 set s0; // pt=0の席の優先順位番号 set s1; // pt=1,2の席の優先順位番号 set ss; // 待機中の人のid for(i=0; ifirst; int flag=it0->second.first; int id=it0->second.second; z.erase(*it0); if(tt_prev!=tt || flag_prev!=flag) { while(!ss.empty() && !s0.empty()) { int id=(*ss.begin()); ss.erase(id); int q=(*s0.begin()); status[id]=q; pt[q]+=10; update(s0,s1,q,pt[q]); if(vv[q]>0) { int tmp=vv2[vv[q]-1]; pt[tmp]++; update(s0,s1,tmp,pt[tmp]); } if(vv[q]0) { int tmp=vv2[vv[q]-1]; pt[tmp]++; update(s0,s1,tmp,pt[tmp]); } if(vv[q]0) { int tmp=vv2[vv[q]-1]; pt[tmp]++; update(s0,s1,tmp,pt[tmp]); } if(vv[q]0) { int tmp=vv2[vv[q]-1]; pt[tmp]++; update(s0,s1,tmp,pt[tmp]); } if(vv[q]=0) { int q=status[id]; pt[q]-=10; update(s0,s1,q,pt[q]); if(vv[q]>0) { int tmp=vv2[vv[q]-1]; pt[tmp]--; update(s0,s1,tmp,pt[tmp]); } if(vv[q]=0) { printf("%d\n", vv[status[i]]+1); } else { printf("-1\n"); } } return 0; }