Submission #15563

#TimeUsernameProblemLanguageResultExecution timeMemory
15563ainta통로 위의 개미 (kriii3_X)C++98
30 / 85
3000 ms158008 KiB
#include<stdio.h> #include<algorithm> using namespace std; struct SegTree{ SegTree *c1, *c2; long long S; SegTree(){ c1=c2=NULL; S=0; } }; long long L, Q, cnt; long long n; struct Query{ long long b, e; }w[5]; void AddQ(long long b, long long e){ if(b<0)b+=2*L,e+=2*L; b%=(2*L),e%=(2*L); if(b>e)e+=2*L; if(e>=2*L){ w[cnt].b=b,w[cnt].e=2*L-1;cnt++; w[cnt].b=0,w[cnt].e=e-2*L;cnt++; return; } w[cnt].b=b,w[cnt].e=e;cnt++; } SegTree *Root; void Ins(SegTree *nd, long long b, long long e, long long x, long long y){ if(b==e){ nd->S+=y; return; } long long m = (b+e)>>1; if(!nd->c1)nd->c1=new SegTree(), nd->c2=new SegTree(); if(x <= m)Ins(nd->c1,b,m,x,y); else Ins(nd->c2,m+1,e,x,y); nd->S = nd->c1->S + nd->c2->S; } long long Gap(SegTree *nd, long long b, long long e, long long s, long long l){ if(b==s&&e==l){ return nd->S; } long long m = (b+e)>>1, r = 0; if(nd->c1 && s <= m)r += Gap(nd->c1,b,m,s,min(m,l)); if(nd->c2 && l > m)r += Gap(nd->c2,m+1,e,max(m+1,s),l); return r; } long long Pro(long long mid, long long t){ long long s = 0; cnt = 0; if(mid < L){ AddQ(-t,-t+mid); if(mid)AddQ(2*L-mid-t,2*L-t-1); } else if(mid > L){ AddQ(-t,-t+2*L-mid); AddQ(-t+mid,-t+L*2-1); } else AddQ(0,2*L-1); s=0; for(long long i=0;i<cnt;i++){ s += Gap(Root,0,2*L-1,w[i].b,w[i].e); } return s; } int Rank[601][1010], In[201000], SZ[601], MM; int TP[201000]; void init(){ int i, j, cnt = 0, pv = 1, tt; for(i=1;i<=MM;i++){ for(j=1;j<=SZ[i];j++)TP[++cnt]=Rank[i][j]; SZ[i]=0; } tt = (cnt-1)/600+1; for(i=1;i<=cnt;i++){ if(SZ[pv] == tt)pv++; Rank[pv][++SZ[pv]] = TP[i]; In[TP[i]]=pv; } MM = pv; } void UDT(int a, int r){ if(!MM){ MM++; Rank[1][++SZ[1]] = a; In[a] = 1; return; } int i, x, rr = r; for(i=1;i<=MM;i++){ if(SZ[i]+1>=r)break; r-=SZ[i]; } x = i; if(SZ[x] == 800){ init(); UDT(a,rr); return; } for(i=SZ[x];i>=r;i--)Rank[x][i+1]=Rank[x][i]; Rank[x][r] = a; SZ[x]++; In[a] = x; } int Get(int a){ int x = In[a], i, c = 0; for(i=1;i<x;i++)c+=SZ[i]; for(i=1;i<=SZ[x];i++){ if(Rank[x][i]==a)break; } return c+i; } int main(){ long long i, be, ed, mid, r; long long t; long long p; long long a, b; scanf("%lld%lld",&L,&Q); Root = new SegTree(); while(Q--){ scanf("%lld%lld%lld",&t,&p,&a); t%=(2*L); if(p==1){ scanf("%lld",&b); if(b == -1)a = 2*L-a; n++; UDT(n, Pro(a,t)+1); a=(a-t+2*L)%(2*L); Ins(Root, 0, 2*L-1, a, 1); } if(p==2){ a = Get(a); be = 0, ed = L-1, r = L; while(be<=ed){ mid=(be+ed)>>1; if(Pro(mid,t) >= a){ r= mid; ed=mid-1; } else be=mid+1; } printf("%lld\n",r); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...