Submission #160265

#TimeUsernameProblemLanguageResultExecution timeMemory
160265bortozHorses (IOI15_horses)C++17
100 / 100
383 ms31864 KiB
#include "horses.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; #define fi first #define se second constexpr int MAXN = 1 << 19; constexpr int MOD = 1e9 + 7; pair<int, bool> segX[2 * MAXN]; int segM[2 * MAXN]; int Y[MAXN]; pair<int, bool> joinX(pair<int, bool>& a, pair<int, bool>& b) { ll r = 1ll * a.fi * b.fi; bool o = (r >= MOD) || a.se || b.se; return make_pair(r % MOD, o); } pair<int, bool> queryX(int l, int r) { pair<int, bool> ans{1, false}; for (l += MAXN, r += MAXN; l < r; l /= 2, r /= 2) { if (l & 1) ans = joinX(ans, segX[l++]); if (r & 1) ans = joinX(ans, segX[--r]); } return ans; } int joinM(int a, int b) { pair<int, bool> mulX = queryX(a + 1, b + 1); if (mulX.se) return b; return Y[a] > 1ll * mulX.fi * Y[b] ? a : b; } int init(int N, int* X, int*_Y) { copy(_Y, _Y + N, Y); for (int i = 0; i < N; i++) { segX[i + MAXN] = make_pair(X[i], false); } iota(segM + MAXN, segM + 2 * MAXN, 0); for (int i = MAXN - 1; i > 0; i--) { segX[i] = joinX(segX[2 * i], segX[2 * i + 1]); segM[i] = joinM(segM[2 * i], segM[2 * i + 1]); } return 1ll * queryX(0, segM[1] + 1).fi * Y[segM[1]] % MOD; } int updateX(int pos, int val) { for (segX[pos += MAXN] = make_pair(val, false); pos > 1; pos /= 2) { segX[pos / 2] = joinX(segX[pos & -2], segX[pos | 1]); segM[pos / 2] = joinM(segM[pos & -2], segM[pos | 1]); } return 1ll * queryX(0, segM[1] + 1).fi * Y[segM[1]] % MOD; } int updateY(int pos, int val) { for (Y[pos] = val, pos += MAXN; pos > 1; pos /= 2) { segX[pos / 2] = joinX(segX[pos & -2], segX[pos | 1]); segM[pos / 2] = joinM(segM[pos & -2], segM[pos | 1]); } return 1ll * queryX(0, segM[1] + 1).fi * Y[segM[1]] % MOD; }

Compilation message (stderr)

horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:46:54: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
  return 1ll * queryX(0, segM[1] + 1).fi * Y[segM[1]] % MOD;
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:54:54: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
  return 1ll * queryX(0, segM[1] + 1).fi * Y[segM[1]] % MOD;
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:62:54: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
  return 1ll * queryX(0, segM[1] + 1).fi * Y[segM[1]] % MOD;
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
#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...