Submission #119770

#TimeUsernameProblemLanguageResultExecution timeMemory
119770errorgornBitaro, who Leaps through Time (JOI19_timeleap)C++14
100 / 100
1480 ms269684 KiB
#include <cstdio> #include <algorithm> #include <utility> using namespace std; typedef pair<int,int> ii; int n; ii input[300005]; inline int read() { int x = 0; char ch = getchar_unlocked(); while (ch >= '0' && ch <= '9'){ x = (x << 3) + (x << 1) + ch - '0'; ch = getchar_unlocked(); } return x; } struct stats{ int l_time,r_time; long long time_used; long long powers_used; stats(int a,int b,int c, int d){ l_time=a; r_time=b; time_used=c; powers_used=d; } stats(stats *i, stats *j){ unions(i,j); } stats(stats *i){ l_time=i->l_time; r_time=i->r_time; time_used=i->time_used; powers_used=i->powers_used; } void unions(stats *l,stats *r){ powers_used=l->powers_used+r->powers_used; time_used=l->time_used+r->time_used; int left=l->l_time+l->time_used,right=l->r_time+l->time_used; if (max(left,r->l_time)<=min(right,r->r_time)){ l_time=max(left,r->l_time)-l->time_used; r_time=min(right,r->r_time)-l->time_used; } else if (right<r->l_time){ time_used+=r->l_time-right; l_time=l->r_time; r_time=l_time; } else{ powers_used+=left-r->r_time; time_used-=left-r->r_time; l_time=l->l_time; r_time=l_time; } } }; struct node{ int s,e,m; stats *val; node *l,*r; node (int _s,int _e){ s=_s,e=_e,m=(s+e)>>1; if (s==e){ val=new stats(input[s].first,input[s].second-1,1,0); } else{ l=new node(s,m); r=new node(m+1,e); val=new stats(l->val,r->val); } } stats* query(int i,int j){ if (s==i && e==j) return val; else if (j<=m) return l->query(i,j); else if (m<i) return r->query(i,j); else return new stats(l->query(i,m),r->query(m+1,j)); } void update(int i){ if (s==e){ val=new stats(input[s].first,input[s].second-1,1,0); } else{ if (i<=m) l->update(i); else r->update(i); val->unions(l->val,r->val); } } }*root; struct rnode{ int s,e,m; stats *val; rnode *l,*r; rnode (int _s,int _e){ s=_s,e=_e,m=(s+e)>>1; if (s==e){ val=new stats(input[n-s].first,input[n-s].second-1,1,0); } else{ l=new rnode(s,m); r=new rnode(m+1,e); val=new stats(l->val,r->val); } } stats* query(int i,int j){ if (s==i && e==j) return val; else if (j<=m) return l->query(i,j); else if (m<i) return r->query(i,j); else return new stats(l->query(i,m),r->query(m+1,j)); } void update(int i){ if (s==e){ val=new stats(input[n-s].first,input[n-s].second-1,1,0); } else{ if (i<=m) l->update(i); else r->update(i); val->unions(l->val,r->val); } } }*rroot; int main(){ //freopen("input.txt","r",stdin); int q; n=read(); q=read(); if (n==1){ int a,b; while (q--){ read(),read(); a=read(); read(); b=read(); if (a>b) printf("%d\n",a-b); else printf("0\n"); } return 0; } for (int x=1;x<n;x++) input[x].first=read(),input[x].second=read(); root=new node(1,n-1); rroot=new rnode(1,n-1); int a,b,c,d; int type; stats *res; int fin_time; while (q--){ type=read(); if (type==2){ a=read(); b=read(); c=read(); d=read(); if (a<c) res=new stats(root->query(a,c-1)); else if (c<a) res=new stats(rroot->query(n-a+1,n-c)); else{ if (b>d) printf("%d\n",b-d); else printf("0\n"); continue; } //printf("%lld %lld %lld %lld\n",res->l_time,res->r_time,res->time_used,res->powers_used); fin_time=max(b,res->l_time); if (b>res->r_time){ res->powers_used+=b-res->r_time; fin_time=res->r_time; } fin_time+=res->time_used; if (d<fin_time){ res->powers_used+=fin_time-d; } printf("%lld\n",res->powers_used); } else{ a=read(); b=read(); c=read(); input[a]=ii(b,c); root->update(a); rroot->update(n-a); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...