Submission #1348840

#TimeUsernameProblemLanguageResultExecution timeMemory
1348840ElayV13Horses (IOI15_horses)C++20
0 / 100
9 ms12144 KiB
#include "horses.h"
#include "bits/stdc++.h"
using namespace std;

#define ll long long
const int mod=1e9+7;
const int S=500001;
const int ll M=1e9+5;

int n;
vector<ll>x,y;

ll st[S*4];

void update(int idx,int l,int r,int pos,ll val){
      if(l==r){
            st[idx]=min(M,val);
            return;
      }
      int mid=(l+r)>>1;
      if(mid>=pos) update(2*idx,l,mid,pos,val);
      else update(2*idx+1,mid+1,r,pos,val);
      st[idx]=(st[idx*2]*st[idx*2+1]);
      st[idx]=min(M,st[idx]);
}

ll ask(int idx,int l,int r,int ql,int qr){
      if(ql>r||l>qr) return 1;
      else if(ql<=l&&r<=qr) return min(st[idx],M);
      int mid=(l+r)>>1;
      return min(M,ask(2*idx,l,mid,ql,qr)*ask(2*idx+1,mid+1,r,ql,qr));
}

int upd(int i,int x){
      ++i;
      update(1,1,n,i,x);
}
int get(int l,int r){
      if(l>r) return 0;
      ++l;
      ++r;
      return ask(1,1,n,l,r);
}

int init(int N,int X[],int Y[])
{
      n=N;
      y.resize(N);
      x.resize(N);
      for(int i=0;i<N;i++) y[i]=Y[i],x[i]=X[i];
      for(int i=0;i<N;i++) upd(i,X[i]);
      int last=-1;
      for(int i=N-1;i>=max(0,N-30);i--){
            bool bp=1;
            for(int j=i+1;j<N;j++){
                  if(get(j,N-1)*Y[j]>Y[i]) bp=0;
            }
            if(bp) last=i;
      }
      int res=1;
      for(int i=0;i<=last;i++){
            res*=X[i];
            res%=mod;
            if(i==last) res*=Y[i];
            res%=mod;
      }
      return res;
}

int updateX(int pos,int val)
{
      upd(pos,val);
      int last=-1;
      for(int i=n-1;i>=max(0,n-30);i--){
            bool bp=1;
            for(int j=i+1;j<n;j++){
                  if(get(i+1,j)*y[j]>y[i]) bp=0;
            }
            if(bp) last=i;
      }
      int res=1;
      for(int i=0;i<=last;i++){
            res*=x[i];
            res%=mod;
            if(i==last) res*=y[i];
            res%=mod;
      }
      return res;
}

int updateY(int pos,int val)
{
      y[pos]=val;
      int last=-1;
      for(int i=n-1;i>=max(0,n-30);i--){
            bool bp=1;
            for(int j=i+1;j<n;j++){
                  if(get(i+1,j)*y[j]>y[i]) bp=0;
            }
            if(bp) last=i;
      }
      int res=1;
      for(int i=0;i<=last;i++){
            res*=x[i];
            res%=mod;
            if(i==last) res*=y[i];
            res%=mod;
      }
      return res;
}

Compilation message (stderr)

horses.cpp: In function 'int upd(int, int)':
horses.cpp:37:1: warning: no return statement in function returning non-void [-Wreturn-type]
   37 | }
      | ^
#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...