This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include "horses.h"
using namespace std;
#define MOD 1000000007
int ng;
vector<int> xg;
long long power(long long n, long long pow, long long m) {if (pow == 0) return 1;if (pow % 2 == 0) {long long x = power(n, pow / 2, m);return (x * x) % m;}else return (power(n, pow - 1, m) * n) % m;}
template<typename T>
struct LazySegmentTree{
int n;
vector<T> t, lazy, a;
T neutral, lazy_neutral;
function<T(const T&, const T&)> merge;
function<T(const T&, const T&)> upd;
bool range_modif = false;
LazySegmentTree(int _n, T _neutral, T _lazy_neutral, const function<T(const T&, const T&)> &_merge, const function<T(const T&, const T&)> &_upd, bool _range_modif){
range_modif = _range_modif;
init(_n, _neutral, _lazy_neutral, _merge, _upd);
}
LazySegmentTree(vector<T> _a, T _neutral, T _lazy_neutral, const function<T(const T&, const T&)> &_merge, const function<T(const T&, const T&)> &_upd, bool _range_modif){
range_modif = _range_modif, a = _a;
int _n = (int)a.size();
init(_n, _neutral, _lazy_neutral, _merge, _upd);
build(1, 0, n - 1);
}
void init(int _n, T _neutral, T _lazy_neutral, const function<T(const T&, const T&)> &_merge, const function<T(const T&, const T&)> &_upd){
n = _n, neutral = _neutral, lazy_neutral = _lazy_neutral, merge = _merge, upd = _upd;
t.assign(4 * n, neutral);
lazy.assign(4 * n, lazy_neutral);
}
void build(int i, int l, int r){
if(l == r){
t[i] = a[l];
return;
}
int mid = (l + r) >> 1;
build(2 * i, l, mid);
build(2 * i + 1, mid + 1, r);
t[i] = merge(t[2 * i], t[2 * i + 1]);
}
void push(int i, int l, int r){
if(lazy[i] == lazy_neutral)return;
t[i] = upd(t[i], lazy[i] * (range_modif ? (r - l + 1) : 1));
if(l != r){
lazy[2 * i] = upd(lazy[2 * i], lazy[i]);
lazy[2 * i + 1] = upd(lazy[2 * i + 1], lazy[i]);
}
lazy[i] = lazy_neutral;
}
void modif(int i, int l, int r, int tl, int tr, T val){
push(i, l, r);
if(l > tr || r < tl)return;
if(l >= tl && r <= tr){
lazy[i] = upd(lazy[i], val);
push(i, l, r);
return;
}
int mid = (l + r) >> 1;
modif(2 * i, l, mid, tl, tr, val);
modif(2 * i + 1, mid + 1, r, tl, tr, val);
t[i] = merge(t[2 * i], t[2 * i + 1]);
}
T query(int i, int l, int r, int tl, int tr){
push(i, l, r);
if(l > tr || r < tl)return neutral;
if(l >= tl && r <= tr)return t[i];
int mid = (l + r) >> 1;
T left = query(2 * i, l, mid, tl, tr);
T right = query(2 * i + 1, mid + 1, r, tl, tr);
return merge(left, right);
}
void modif(int l, int r, T val){
modif(1, 0, n - 1, l, r, val);
}
void modif(int poz, T val){
modif(1, 0, n - 1, poz, poz, val);
}
T query(int l, int r){
return query(1, 0, n - 1, l, r);
}
T query(int poz){
return query(1, 0, n - 1, poz, poz);
}
//n, neutral, lazy neutral, merge, upd, bool range update
};
int mergex(int a, int b)
{
long long temp = a;
temp*=b;
return (int)(temp%MOD);
}
int updx(int a, int b)
{
return b;
}
int mergey(int a, int b)
{
return max(a, b);
}
int updy(int a, int b)
{
return b;
}
LazySegmentTree<int> stx(500000, 1, -1, mergex, updx, 0);
LazySegmentTree<int> sty(500000, 0, -1, mergey, updy, 0);
set<int> s;
int init(int n, int* x, int* y)
{
ng = n;
s.insert(0);
s.insert(ng);
for(int i = 0; i < ng; i++)
{
stx.modif(i, x[i]);
xg.push_back(x[i]);
if(x[i] > 1)
{
s.insert(i);
}
sty.modif(i, y[i]);
}
auto it = s.end();
it--;
long long pref = 1;
while(true)
{
if(*it == ng)
{
it--;
continue;
}
pref*=xg[*it];
if(pref > 1000000000)
{
break;
}
if(it == s.begin())
{
break;
}
it--;
}
auto first = it;
int should_multiply = stx.query(0LL, *it);
long long now = 1;
long long mx = 0;
for(; it != s.end(); it++)
{
if(it != first)
{
now*=xg[*it];
}
auto urmatorul = it;
urmatorul++;
if(urmatorul == s.end()){break;}
long long now_range = now*sty.query(*it, (*urmatorul)-1);
mx = max(mx, now_range);
}
mx%=MOD;
return (int)((mx*should_multiply)%MOD);
}
int updateX(int pos, int val)
{
if(stx.query(pos) == 1 && val != 1)
{
s.insert(pos);
}
else if(stx.query(pos) != 1 && val == 1)
{
if(pos!= 0)
{
s.erase(s.find(pos));
}
}
xg[pos] = val;
stx.modif(pos, val);
auto it = s.end();
it--;
long long pref = 1;
while(true)
{
if(*it == ng)
{
it--;
continue;
}
pref*=xg[*it];
if(pref > 1000000000)
{
break;
}
if(it == s.begin())
{
break;
}
it--;
}
auto first = it;
long long should_multiply = stx.query(0LL, *it);
long long now = 1;
long long mx = 0;
for(; it != s.end(); it++)
{
if(it != first)
{
now*=xg[*it];
}
auto urmatorul = it;
urmatorul++;
if(urmatorul == s.end()){break;}
long long now_range = now*sty.query(*it, *urmatorul-1);
mx = max(mx, now_range);
}
mx%=MOD;
return (int)((mx*should_multiply)%MOD);
}
int updateY(int pos, int val)
{
sty.modif(pos, val);
auto it = s.end();
it--;
long long pref = 1;
while(true)
{
if(*it == ng)
{
it--;
continue;
}
pref*=xg[*it];
if(pref > 1000000000)
{
break;
}
if(it == s.begin())
{
break;
}
it--;
}
auto first = it;
long long should_multiply = stx.query(0LL, *it);
long long now = 1;
long long mx = 0;
for(; it != s.end(); it++)
{
if(it != first)
{
now*=xg[*it];
}
auto urmatorul = it;
urmatorul++;
if(urmatorul == s.end()){break;}
long long now_range = now*sty.query(*it, *urmatorul-1);
mx = max(mx, now_range);
}
mx%=MOD;
return (int)((mx*should_multiply)%MOD);
}
Compilation message (stderr)
horses.cpp: In function 'int updx(int, int)':
horses.cpp:116:14: warning: unused parameter 'a' [-Wunused-parameter]
116 | int updx(int a, int b)
| ~~~~^
horses.cpp: In function 'int updy(int, int)':
horses.cpp:126:14: warning: unused parameter 'a' [-Wunused-parameter]
126 | int updy(int a, int b)
| ~~~~^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |