Submission #414529

#TimeUsernameProblemLanguageResultExecution timeMemory
414529TLP39Horses (IOI15_horses)C++14
100 / 100
847 ms52404 KiB
#include "horses.h" #include <bits/stdc++.h> using namespace std; typedef long long int ll; typedef pair<ll,bool> lb; int n; const ll big=1000000007; lb seg_x[2000040]; int seg_m[2000040]; ll y[500010]; int pos[500010]; int inte[2000040][2]; void build_x(int X[],int v,int st,int ed) { inte[v][0]=st; inte[v][1]=ed; if(st==ed) { pos[st]=v; seg_x[v]={((ll)X[st])%big,((ll)X[st])>=big}; return; } int mid=(st+ed)>>1; build_x(X,2*v,st,mid); build_x(X,2*v+1,mid+1,ed); ll temp=seg_x[2*v].first*seg_x[2*v+1].first; seg_x[v]={temp%big,(temp>=big || seg_x[2*v].second || seg_x[2*v+1].second)}; } lb ti(lb a,lb b) { ll temp=a.first*b.first; return {(temp%big),temp>=big || a.second || b.second}; } lb prod(int st,int ed,int v) { if(st==inte[v][0] && ed==inte[v][1]) return seg_x[v]; int mid=(inte[v][0]+inte[v][1])>>1; if(ed<=mid) return prod(st,ed,2*v); if(st>mid) return prod(st,ed,2*v+1); return ti(prod(st,mid,2*v),prod(mid+1,ed,2*v+1)); } void build_m(int v,int st,int ed) { if(st==ed) { seg_m[v]=st; return; } int mid=(st+ed)>>1; build_m(2*v,st,mid); build_m(2*v+1,mid+1,ed); int a=seg_m[2*v],b=seg_m[2*v+1]; lb temp=prod(a+1,b,1); if(temp.second || temp.first*y[b]>=y[a]) seg_m[v]=b; else seg_m[v]=a; } int init(int N, int X[], int Y[]) { n=N; for(int i=0;i<n;i++) y[i]=Y[i]; build_x(X,1,0,n-1); build_m(1,0,n-1); int temp=seg_m[1]; return (int)((prod(0,temp,1).first*y[temp])%big); } void change(int p) { int v=pos[p]; v>>=1; int a,b; lb temp; while(v) { a=seg_m[2*v]; b=seg_m[2*v+1]; temp=prod(a+1,b,1); if(temp.second || temp.first*y[b]>=y[a]) seg_m[v]=b; else seg_m[v]=a; v>>=1; } } int updateX(int p, int val) { int v=pos[p]; seg_x[v]={((ll)val)%big,((ll)val)>=big}; v>>=1; ll temp; while(v) { temp=seg_x[2*v].first*seg_x[2*v+1].first; seg_x[v]={temp%big,(temp>=big || seg_x[2*v].second || seg_x[2*v+1].second)}; v>>=1; } change(p); int temp2=seg_m[1]; return (int)((prod(0,temp2,1).first*y[temp2])%big); } int updateY(int p, int val) { y[p]=val; change(p); int temp2=seg_m[1]; return (int)((prod(0,temp2,1).first*y[temp2])%big); }
#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...