Submission #1314828

#TimeUsernameProblemLanguageResultExecution timeMemory
1314828kawhietGame (IOI13_game)C++20
10 / 100
10229 ms321536 KiB
#include <bits/stdc++.h>
#include "game.h"
using namespace std;

constexpr int N = 2001;
constexpr int MX = 12;

int lg[N];

struct SparseTable {
    int n, m;
    vector<vector<long long>> dp;

    SparseTable(int _n) {
        n = _n;
        m = __lg(n) + 1;
        dp.resize(n, vector<long long>(m));
    }

    void build(vector<long long> &a) {
        for (int i = 0; i < n; i++) {
            dp[i][0] = a[i];
        }
        for (int j = 1; j < m; j++) {
            for (int i = 0; i < n; i++) {
                if (i + (1 << (j - 1)) < n) {
                    dp[i][j] = __gcd(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);
                }
            }
        }
    }

    long long get(int l, int r) {
        int x = lg[r - l + 1];
        return __gcd(dp[l][x], dp[r - (1 << x) + 1][x]);
    }
};

int n, m;
vector<vector<long long>> a;
vector<SparseTable> t;

void init(int R, int C) {
    for (int i = 2; i < N; i++) {
        lg[i] = lg[i / 2] + 1;
    }
    n = R;
    m = C;
    a.resize(n, vector<long long>(m));
    for (int i = 0; i < n; i++) {
        t.push_back(SparseTable(m));
    }
}

void update(int i, int j, long long k) {
    a[i][j] = k;
    t[i].build(a[i]);
}

long long calculate(int p, int q, int u, int v) {
    long long ans = 0;
    for (int i = p; i <= u; i++) {
        ans = __gcd(ans, t[i].get(q, v));
    }
    return ans;
}
#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...