Submission #1219000

#TimeUsernameProblemLanguageResultExecution timeMemory
1219000LIAHorses (IOI15_horses)C++17
100 / 100
230 ms53860 KiB
#include "horses.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef tuple <ll,ll,ll> plll;
typedef vector <plll> vplll;
typedef pair <ll,ll> pll;
typedef vector <ll> vll;
typedef vector <pll> vpll;
typedef vector <vector <pll>> vvpll;
typedef vector <vector <ll>> vvll;
typedef vector <bool> vb;
typedef vector <vector <bool>> vvb;
#define loop(i, s, e) for (ll i = (s); i < (e); ++i)
#define loopr(i, e, s) for (ll i = (e)-1; i >= (s); --i)
#define all(a) a.begin(), a.end()
const ll inf = 1e9 + 7;

vll seg;
vector<double> xlog, ylog;
vll X, Y;
ll n;
ll sz=1;

vector<double> seg2, lazy2;
vector<ll> idx2;

void build() {
    for (; sz<n; sz*=2);
    seg.assign(2*sz, 1);
    loop(i,0,n) seg[sz+i] = X[i];
    loop(i,sz+n,2*sz) seg[i] = 1;
    loopr(i,sz,1) seg[i] = (seg[2*i] * seg[2*i+1]) % inf;
}

void update(ll p, ll val) {
    ll pos = sz + p;
    seg[pos] = val;
    for (pos/=2; pos>0; pos/=2) seg[pos] = (seg[2*pos] * seg[2*pos+1]) % inf;
}

ll query(ll rr) {
    ll l = sz, r = sz + rr;
    ll ans = 1;
    while (l <= r) {
        if (l%2 == 1) ans = (ans * seg[l++]) % inf;
        if (r%2 == 0) ans = (ans * seg[r--]) % inf;
        l/=2;
        r/=2;
    }
    return ans;
}

void push2(ll p) {
    if (lazy2[p] != 0) {
        lazy2[2*p] += lazy2[p]; seg2[2*p] += lazy2[p];
        lazy2[2*p+1] += lazy2[p]; seg2[2*p+1] += lazy2[p];
        lazy2[p] = 0;
    }
}

void pull2(ll p) {
    if (seg2[2*p] >= seg2[2*p+1]) {
        seg2[p] = seg2[2*p]; idx2[p] = idx2[2*p];
    } else {
        seg2[p] = seg2[2*p+1]; idx2[p] = idx2[2*p+1];
    }
}

void build2() {
    seg2.assign(2*sz, 0);
    lazy2.assign(2*sz, 0);
    idx2.assign(2*sz, 0);
    double cur = 0;
    loop(i,0,n) {
        cur += xlog[i];
        seg2[sz+i] = cur + ylog[i];
        idx2[sz+i] = i;
    }
    loop(i,sz+n,2*sz) {
        seg2[i] = -1e300;
        idx2[i] = i - sz;
    }
    loopr(i,sz,1) pull2(i);
}

void rangeAdd(ll l, ll r, double v, ll p, ll lb, ll rb) {
    if (r < lb || rb < l) return;
    if (l <= lb && rb <= r) {
        seg2[p] += v;
        lazy2[p] += v;
        return;
    }
    push2(p);
    ll m = (lb + rb) / 2;
    rangeAdd(l, r, v, 2*p, lb, m);
    rangeAdd(l, r, v, 2*p+1, m+1, rb);
    pull2(p);
}

ll getIdx() {
    return idx2[1];
}

int init(int N, int X1[], int Y1[]) {
    n = N;
    xlog.resize(n);
    ylog.resize(n);
    X.resize(n);
    Y.resize(n);
    loop(i,0,n) {
        xlog[i] = log2((double)X1[i]);
        ylog[i] = log2((double)Y1[i]);
        X[i] = X1[i];
        Y[i] = Y1[i];
    }
    build();
    build2();
    ll idx = getIdx();
    ll ansi = query(idx);
    ansi = (ansi * Y[idx]) % inf;
    return ansi;
}

int updateX(int pos, int val) {
    double delta = log2((double)val) - xlog[pos];
    xlog[pos] += delta;
    X[pos] = val;
    update(pos, val);
    rangeAdd(pos, n-1, delta, 1, 0, sz-1);
    ll idx = getIdx();
    ll ansi = query(idx);
    ansi = (ansi * Y[idx]) % inf;
    return ansi;
}

int updateY(int pos, int val) {
    double delta = log2((double)val) - ylog[pos];
    ylog[pos] += delta;
    Y[pos] = val;
    rangeAdd(pos, pos, delta, 1, 0, sz-1);
    ll idx = getIdx();
    ll ansi = query(idx);
    ansi = (ansi * Y[idx]) % inf;
    return ansi;
}
#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...