Submission #602283

#TimeUsernameProblemLanguageResultExecution timeMemory
602283DJeniUpSweeping (JOI20_sweeping)C++17
100 / 100
15311 ms1817072 KiB
#include <bits/stdc++.h> using namespace std; typedef int ll; typedef pair<ll,ll>pairll; typedef pair<ll,pairll>pairlll; typedef unsigned long long ull; typedef long double ld; #define fr first #define sc second #define pb push_back #define INF 1000000007 #define N 100000 #define endl '\n' ll n,m,q,h,X,Y; struct D{ ll u,r,x,y,s[2],gx,gy; }l; struct T{ ll x,y,r,s[2],num,u[2],numdek; }t[1500007]; struct Tree{ ll l,r,prom,key,mx,h,par,num; }tre; vector<D>d; vector<vector<ll> >v[2]; vector<vector<Tree> >tr[2]; set<pairlll>k,k1,ps; vector<ll>v1,root[2],sz[2],widlozhene; set<ll>u1; vector<Tree> tree; void AddF(ll r,ll x,ll y,ll tp){ for(int i=x;i>0;i-=(i&-i)){ v[tp][r][i]=max(v[tp][r][i],y); } return ; } ll R(ll r,ll tp,ll x){ ll res=0; for(int i=x;i<v[tp][r].size();i+=(i&-i)){ res=max(res,v[tp][r][i]); } return res; } void Push(ll x,ll y,ll tp,ll r){ if(x==-1)return ; tr[tp][r][x].h=y; tr[tp][r][x].prom=y; tr[tp][r][x].mx=y; return ; } pairll S(ll x,ll y,ll tp,ll r){ //// cout<<x<<" "<<y<<" "<<tp<<" "<<r<<endl; ////cout<<"S"<<endl; if(x==-1)return {-1,-1}; if(tr[tp][r][x].prom!=0){ Push(tr[tp][r][x].l,tr[tp][r][x].prom,tp,r); Push(tr[tp][r][x].r,tr[tp][r][x].prom,tp,r); tr[tp][r][x].prom=0; } tr[tp][r][x].par=-1; if(tr[tp][r][x].h<=y){ pairll m1=S(tr[tp][r][x].r,y,tp,r); tr[tp][r][x].r=m1.fr; if(tr[tp][r][x].l!=-1){ tr[tp][r][tr[tp][r][x].l].par=x; } if(tr[tp][r][x].r!=-1){ tr[tp][r][x].mx=max(tr[tp][r][x].h,tr[tp][r][tr[tp][r][x].r].mx); tr[tp][r][tr[tp][r][x].r].par=x; }else{ tr[tp][r][x].mx=tr[tp][r][x].h; } return {x,m1.sc}; }else{ pairll m1=S(tr[tp][r][x].l,y,tp,r); tr[tp][r][x].l=m1.sc; if(tr[tp][r][x].l!=-1){ tr[tp][r][tr[tp][r][x].l].par=x; } if(tr[tp][r][x].r!=-1){ tr[tp][r][x].mx=max(tr[tp][r][x].h,tr[tp][r][tr[tp][r][x].r].mx); tr[tp][r][tr[tp][r][x].r].par=x; }else{ tr[tp][r][x].mx=tr[tp][r][x].h; } return {m1.fr,x}; } } ll M(ll x,ll y,ll tp,ll r){ // cout<<x<<" "<<y<<" "<<tp<<" "<<r<<" "<<endl; if(x==-1)return y; if(y==-1)return x; tr[tp][r][x].par=-1; tr[tp][r][y].par=-1; if(tr[tp][r][x].prom!=0){ Push(tr[tp][r][x].l,tr[tp][r][x].prom,tp,r); Push(tr[tp][r][x].r,tr[tp][r][x].prom,tp,r); tr[tp][r][x].prom=0; } if(tr[tp][r][y].prom!=0){ Push(tr[tp][r][y].l,tr[tp][r][y].prom,tp,r); Push(tr[tp][r][y].r,tr[tp][r][y].prom,tp,r); tr[tp][r][y].prom=0; } if(tr[tp][r][x].key>tr[tp][r][y].key){ tr[tp][r][x].r=M(tr[tp][r][x].r,y,tp,r); if(tr[tp][r][x].l!=-1){ tr[tp][r][tr[tp][r][x].l].par=x; } if(tr[tp][r][x].r!=-1){ tr[tp][r][x].mx=max(tr[tp][r][x].h,tr[tp][r][tr[tp][r][x].r].mx); tr[tp][r][tr[tp][r][x].r].par=x; }else{ tr[tp][r][x].mx=tr[tp][r][x].h; } return x; }else{ tr[tp][r][y].l=M(x,tr[tp][r][y].l,tp,r); if(tr[tp][r][y].l!=-1){ tr[tp][r][tr[tp][r][y].l].par=y; } if(tr[tp][r][y].r!=-1){ tr[tp][r][y].mx=max(tr[tp][r][y].h,tr[tp][r][tr[tp][r][y].r].mx); tr[tp][r][tr[tp][r][y].r].par=y; }else{ tr[tp][r][y].mx=tr[tp][r][y].h; } return y; } } void Adddek(ll x,ll r,ll tp,ll num){ //cout<<"!"<<endl; pairll m1=S(root[tp][r],x,tp,r); t[num].numdek=sz[tp][r]; tr[tp][r].pb(tre); tr[tp][r][sz[tp][r]].l=-1; tr[tp][r][sz[tp][r]].r=-1; tr[tp][r][sz[tp][r]].key=rand(); tr[tp][r][sz[tp][r]].mx=x; tr[tp][r][sz[tp][r]].h=x; tr[tp][r][sz[tp][r]].par=-1; tr[tp][r][sz[tp][r]].num=num; // cout<<"!"<<endl; root[tp][r]=M(M(m1.fr,sz[tp][r],tp,r),m1.sc,tp,r); if(root[tp][r]!=-1)tr[tp][r][root[tp][r]].par=-1; sz[tp][r]++; return ; } ll Deldek(ll x,ll vnum,ll tp,ll r){ if(x==-1)return -1; //if(widlozhene[vnum]!=x)exit(1); if(vnum+1==widlozhene.size()){ tr[tp][r][x].par=-1; if(tr[tp][r][x].prom!=0){ Push(tr[tp][r][x].l,tr[tp][r][x].prom,tp,r); Push(tr[tp][r][x].r,tr[tp][r][x].prom,tp,r); tr[tp][r][x].prom=0; } return M(tr[tp][r][x].l,tr[tp][r][x].r,tp,r); } tr[tp][r][x].par=-1; if(tr[tp][r][x].prom!=0){ Push(tr[tp][r][x].l,tr[tp][r][x].prom,tp,r); Push(tr[tp][r][x].r,tr[tp][r][x].prom,tp,r); tr[tp][r][x].prom=0; } if(widlozhene[vnum+1]==tr[tp][r][x].l){ tr[tp][r][x].l=Deldek(tr[tp][r][x].l,vnum+1,tp,r); if(tr[tp][r][x].l!=-1){ tr[tp][r][tr[tp][r][x].l].par=x; } if(tr[tp][r][x].r!=-1){ tr[tp][r][x].mx=max(tr[tp][r][x].h,tr[tp][r][tr[tp][r][x].r].mx); tr[tp][r][tr[tp][r][x].r].par=x; }else{ tr[tp][r][x].mx=tr[tp][r][x].h; } }else{ tr[tp][r][x].r=Deldek(tr[tp][r][x].r,vnum+1,tp,r); if(tr[tp][r][x].l!=-1){ tr[tp][r][tr[tp][r][x].l].par=x; } if(tr[tp][r][x].r!=-1){ tr[tp][r][x].mx=max(tr[tp][r][x].h,tr[tp][r][tr[tp][r][x].r].mx); tr[tp][r][tr[tp][r][x].r].par=x; }else{ tr[tp][r][x].mx=tr[tp][r][x].h; } } return x; } void Del(ll x,ll tp,ll r){ widlozhene.clear(); //cout<<x<<endl; //cout<<"!"; while(x!=-1){ //cout<<x<<" "; widlozhene.pb(x); x=tr[tp][r][x].par; } //cout<<endl; //cout<<"#"; reverse(widlozhene.begin(),widlozhene.end()); if(widlozhene[0]!=root[tp][r])exit(1); //cout<<"&"; root[tp][r]=Deldek(root[tp][r],0,tp,r); if(root[tp][r]!=-1)tr[tp][r][root[tp][r]].par=-1; widlozhene.clear(); return ; } void Update(ll x,ll y,ll tp,ll r){ if(x==-1)return ; if(tr[tp][r][x].mx<=y){ tr[tp][r][x].mx=y; tr[tp][r][x].h=y; tr[tp][r][x].prom=y; return ; } if(tr[tp][r][x].prom!=0){ Push(tr[tp][r][x].l,tr[tp][r][x].prom,tp,r); Push(tr[tp][r][x].r,tr[tp][r][x].prom,tp,r); tr[tp][r][x].prom=0; } Update(tr[tp][r][x].l,y,tp,r); if(tr[tp][r][x].h<y){ tr[tp][r][x].h=y; tr[tp][r][x].mx=max(y,tr[tp][r][x].mx); Update(tr[tp][r][x].r,y,tp,r); } return ; } void Add(ll x,ll y,ll num,ll r); void Perekinuvy(ll x,ll y,ll tp,ll r){ if(x==-1)return ; if(tr[tp][r][x].prom!=0){ Push(tr[tp][r][x].l,tr[tp][r][x].prom,tp,r); Push(tr[tp][r][x].r,tr[tp][r][x].prom,tp,r); tr[tp][r][x].prom=0; } ll z=tr[tp][r][x].num; t[z].x=max(t[z].x,tr[tp][r][x].h); t[z].y=max(t[z].y,y); Perekinuvy(tr[tp][r][x].l,y,tp,r); Perekinuvy(tr[tp][r][x].r,y,tp,r); Del(t[z].numdek,1,t[z].r); Add(t[z].x,t[z].y,z,t[z].r); return ; } void Perekinuvx(ll x,ll y,ll tp,ll r){ if(x==-1)return ; if(tr[tp][r][x].prom!=0){ Push(tr[tp][r][x].l,tr[tp][r][x].prom,tp,r); Push(tr[tp][r][x].r,tr[tp][r][x].prom,tp,r); tr[tp][r][x].prom=0; } ll z=tr[tp][r][x].num; t[z].y=max(t[z].y,tr[tp][r][x].h); t[z].x=max(t[z].x,y); //if(t[z].y>Y)exit(1); Perekinuvx(tr[tp][r][x].l,y,tp,r); Perekinuvx(tr[tp][r][x].r,y,tp,r); Del(t[z].numdek,0,t[z].r); Add(t[z].x,t[z].y,z,t[z].r); return ; } void Newy(ll r){ if(d[r].u==-1){ h++; d.pb(l); v[0].pb(v1); v[1].pb(v1); v[0][h].pb(0); v[1][h].pb(0); d[r].u=h; d[h].u=-1; d[h].r=-1; d[h].x=(d[r].x+d[r].gx)/2; d[h].y=n-d[h].x; d[h].gx=d[r].gx; d[h].gy=d[r].y; d[h].s[0]=1; d[h].s[1]=1; tr[0].pb(tree); tr[1].pb(tree); root[0].pb(-1); root[1].pb(-1); sz[0].pb(0); sz[1].pb(0); } return ; } void Newx(ll r){ if(d[r].r==-1){ h++; d.pb(l); v[0].pb(v1); v[1].pb(v1); v[0][h].pb(0); v[1][h].pb(0); d[r].r=h; d[h].r=-1; d[h].u=-1; d[h].y=(d[r].y+d[r].gy)/2; d[h].x=n-d[h].y; d[h].gy=d[r].gy; d[h].gx=d[r].x; d[h].s[0]=1; d[h].s[1]=1; tr[0].pb(tree); tr[1].pb(tree); root[0].pb(-1); root[1].pb(-1); sz[0].pb(0); sz[1].pb(0); } return ; } void Add(ll x,ll y,ll num,ll r){ //cout<<x<<" "<<y<<endl; while(d[r].x<x || d[r].y<y){ //cout<<r<<" "<<d[r].x<<" "<<d[r].y<<endl; if(x+y>n)exit(0); if(d[r].y<y){ Newy(r); r=d[r].u; }else{ Newx(r); r=d[r].r; } } t[num].s[0]=d[r].s[0]; t[num].s[1]=d[r].s[1]; t[num].r=r; Adddek(x,r,0,num); Adddek(y,r,1,num); return ; } void Addy(ll x,ll y){ ll r=0; while(d[r].x<x || d[r].y<y){ if(d[r].y<y){ ll mx=0; pairll m1=S(root[0][r],x,0,r); root[0][r]=m1.sc; if(root[0][r]!=-1)tr[0][r][root[0][r]].par=-1; Perekinuvy(m1.fr,y,0,r); Newy(r); r=d[r].u; }else{ Update(root[1][r],y,1,r); v[1][r].pb(0); AddF(r,d[r].s[1],y,1); d[r].s[1]++; Newx(r); r=d[r].r; } } Update(root[1][r],y,1,r); v[1][r].pb(0); AddF(r,d[r].s[1],y,1); d[r].s[1]++; return ; } /////// void Addx(ll x,ll y){ ll r=0; while(d[r].x<x || d[r].y<y){ if(d[r].x<x){ ll mx=0; pairll m1=S(root[1][r],y,1,r); root[1][r]=m1.sc; if(root[1][r]!=-1)tr[1][r][root[1][r]].par=-1; Perekinuvx(m1.fr,x,1,r); Newx(r); r=d[r].r; }else{ Update(root[0][r],x,0,r); v[0][r].pb(0); AddF(r,d[r].s[0],x,0); d[r].s[0]++; Newy(r); r=d[r].u; } } Update(root[0][r],x,0,r); v[0][r].pb(0); AddF(r,d[r].s[0],x,0); d[r].s[0]++; return ; } int main() { cin>>n>>m>>q; d.pb(l); v[0].pb(v1); v[1].pb(v1); v[0][0].pb(0); v[1][0].pb(0); d[0].u=-1; d[0].r=-1; d[0].y=n/2; d[0].x=n-d[0].y; d[0].s[0]=1; d[0].s[1]=1; tr[0].pb(tree); tr[1].pb(tree); root[0].pb(-1); root[1].pb(-1); sz[0].pb(0); sz[1].pb(0); for(int i=1;i<=m;i++){ cin>>t[i].x>>t[i].y; t[i].num=i; Add(t[i].x,t[i].y,i,0); } for(int i=1;i<=q;i++){ ll t1; cin>>t1; if(t1==4){ m++; cin>>t[m].x>>t[m].y; t[m].num=m; Add(t[m].x,t[m].y,m,0); }else if(t1==2){ ll x; cin>>x; X=n-x; Y=x; Addx(n-x,x); }else if(t1==3){ ll x; cin>>x; X=x; Y=n-x; Addy(x,n-x); }else{ ll x; cin>>x; t[x].y=max(t[x].y,R(t[x].r,1,t[x].s[1])); t[x].x=max(t[x].x,R(t[x].r,0,t[x].s[0])); Del(t[x].numdek,0,t[x].r); Del(t[x].numdek,1,t[x].r); //cout<<"? "; cout<<t[x].x<<" "<<t[x].y<<endl; Add(t[x].x,t[x].y,x,t[x].r); } } return 0; }

Compilation message (stderr)

sweeping.cpp: In function 'll R(ll, ll, ll)':
sweeping.cpp:53:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |     for(int i=x;i<v[tp][r].size();i+=(i&-i)){
      |                 ~^~~~~~~~~~~~~~~~
sweeping.cpp: In function 'll Deldek(ll, ll, ll, ll)':
sweeping.cpp:175:14: warning: comparison of integer expressions of different signedness: 'll' {aka 'int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  175 |     if(vnum+1==widlozhene.size()){
      |        ~~~~~~^~~~~~~~~~~~~~~~~~~
sweeping.cpp: In function 'void Addy(ll, ll)':
sweeping.cpp:379:16: warning: unused variable 'mx' [-Wunused-variable]
  379 |             ll mx=0;
      |                ^~
sweeping.cpp: In function 'void Addx(ll, ll)':
sweeping.cpp:408:16: warning: unused variable 'mx' [-Wunused-variable]
  408 |             ll mx=0;
      |                ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...