Submission #793820

#TimeUsernameProblemLanguageResultExecution timeMemory
793820PixelCatHorses (IOI15_horses)C++14
100 / 100
589 ms52756 KiB
#ifdef NYAOWO
#include "grader.cpp"
#endif

#include "horses.h"

#include <bits/stdc++.h>
#define For(i, a, b) for(int i = a; i <= b; i++)
#define Forr(i, a, b) for(int i = a; i >= b; i--)
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define sz(x) ((int)x.size())
#define eb emplace_back
#define int LL
using namespace std;
using LL = long long;
using pii = pair<int, int>;

const int MAXN = 500'000;
const int MOD = 1'000'000'007;
const int INF = 2'000'000'000;

#define L(id) ((id) * 2 + 1)
#define R(id) ((id) * 2 + 2)
struct SegTree {
    int a[MAXN * 4 + 10];
    int b[MAXN * 4 + 10];
    void build() {
        fill(a, a + sizeof(a) / sizeof(int), 1);
        fill(b, b + sizeof(b) / sizeof(int), 1);
    }
    void upd(int id, int l, int r, int i, int x) {
        if(l == r) {
            a[id] = x;
            b[id] = x;
            return;
        }
        int m = (l + r) / 2;
        if(i <= m) upd(L(id), l, m, i, x);
        else       upd(R(id), m + 1, r, i, x);
        a[id] = min(INF, a[L(id)] * a[R(id)]);
        b[id] = b[L(id)] * b[R(id)] % MOD;
    }
    int qry(int id, int l, int r, int L, int R) {
        if(l >= L && r <= R) return a[id];
        int m = (l + r) / 2;
        int res = 1;
        if(L <= m) res = min(INF, res * qry(L(id), l, m, L, R));
        if(R > m)  res = min(INF, res * qry(R(id), m + 1, r, L, R));
        return res;
    }
    int qry_mod(int id, int l, int r, int L, int R) {
        if(l >= L && r <= R) return b[id];
        int m = (l + r) / 2;
        int res = 1;
        if(L <= m) res *= qry_mod(L(id), l, m, L, R);
        if(R > m)  res *= qry_mod(R(id), m + 1, r, L, R);
        return res % MOD;
    }
} seg;

int n;
int x[MAXN + 10];
int y[MAXN + 10];

struct SegTree2 {
    bool smol(const int &a, const int &b) {
        if(a == b) return false;
        if(a > b) return !smol(b, a);
        return y[a] < seg.qry(0, 0, n - 1, a + 1, b) * y[b];
    }
    int zzzz(const int &a, const int &b) {
        if(smol(a, b)) return b;
        return a;
    }
    int mx[MAXN * 4 + 10];
    void build(int id, int l, int r) {
        if(l == r) {
            mx[id] = l;
            return;
        }
        int m = (l + r) / 2;
        build(L(id), l, m);
        build(R(id), m + 1, r);
        mx[id] = zzzz(mx[L(id)], mx[R(id)]);
    }
    void upd(int id, int l, int r, int i) {
        if(l == r) return;
        int m = (l + r) / 2;
        if(i <= m) upd(L(id), l, m, i);
        else       upd(R(id), m + 1, r, i);
        mx[id] = zzzz(mx[L(id)], mx[R(id)]);
    }
} uwu;

int32_t eval(int pos) {
    return (int32_t)(y[pos] * seg.qry_mod(0, 0, n - 1, 0, pos) % MOD);
}
int32_t solve() {
    int pos = uwu.mx[0];
    return eval(pos);
}

int32_t init(int32_t N, int32_t X[], int32_t Y[]) {
    n = N;
    seg.build();
    For(i, 0, n - 1) {
        x[i] = X[i];
        seg.upd(0, 0, n - 1, i, x[i]);
    }
    For(i, 0, n - 1) {
        y[i] = Y[i];
    }
    uwu.build(0, 0, n - 1);
    return solve();
}

int32_t updateX(int32_t pos, int32_t val) {	
    x[pos] = val;
    seg.upd(0, 0, n - 1, pos, val);
    uwu.upd(0, 0, n - 1, pos);
    // uwu.build(0, 0, n - 1);
    return solve();
}

int32_t updateY(int32_t pos, int32_t val) {
    y[pos] = val;
    uwu.upd(0, 0, n - 1, pos);
    // uwu.build(0, 0, n - 1);
    return solve();
}
#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...