Submission #1189078

#TimeUsernameProblemLanguageResultExecution timeMemory
1189078raspyHorses (IOI15_horses)C++20
100 / 100
184 ms45988 KiB
#include "horses.h"
#include <bits/stdc++.h>

#define ll long long

using namespace std;

const int MAX_N = 5e5+5;
const int mod = 1e9+7;

struct node
{
  ll x_pr;
  ll rez;
  double lgpr;
  double lgrez;
};

ll n;
ll x[MAX_N], y[MAX_N];
node seg[MAX_N*4];

void upd(ll v, ll l, ll r, ll ix, pair<ll, ll> a)
{
  if (l > r) return;
  if (l==r)
  {
    seg[v].x_pr = a.first;
    seg[v].rez = a.first*a.second%mod;
    seg[v].lgpr = log((double)a.first);
    seg[v].lgrez = log((double)(a.second*a.first));
    return;
  }
  ll mid = (l+r) / 2;
  if (ix <= mid)
    upd(v*2+1, l, mid, ix, a);
  else
    upd(v*2+2, mid+1, r, ix, a);
  ll lv = v*2+1, ds = v*2+2;
  seg[v].x_pr = seg[lv].x_pr*seg[ds].x_pr%mod;
  seg[v].lgpr = seg[lv].lgpr+seg[ds].lgpr;
  if (seg[lv].lgpr + seg[ds].lgrez >= seg[lv].lgrez)
  {
    seg[v].lgrez = seg[lv].lgpr + seg[ds].lgrez;
    seg[v].rez = seg[lv].x_pr*seg[ds].rez%mod;
  }
  else
  {
    seg[v].lgrez = seg[lv].lgrez;
    seg[v].rez = seg[lv].rez;
  }
}

int init(int N, int X[], int Y[])
{
  n = N;
  for (int i = 0; i < n; i++)
  {
    x[i] = X[i]; y[i] = Y[i];
    upd(0, 0, n-1, i, {x[i], y[i]});
  }
  return seg[0].rez;
}

int updateX(int pos, int val)
{
  x[pos] = val;
  upd(0, 0, n-1, pos, {x[pos], y[pos]});
  return seg[0].rez;
}

int updateY(int pos, int val)
{
  y[pos] = val;
  upd(0, 0, n-1, pos, {x[pos], y[pos]});
  return seg[0].rez;
}
#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...