제출 #548435

#제출 시각아이디문제언어결과실행 시간메모리
548435lorenzoferrariGame (IOI13_game)C++17
0 / 100
0 ms212 KiB
#include <bits/stdc++.h>
#include "game.h"
#pragma GCC optimize ("O3")
using namespace std;
using LL = long long;

#ifndef LORENZO
#define cerr if(0) cerr
#endif

constexpr int LIM = 1e9 + 1;

int R;
int C;

inline LL gcd(LL a, LL b) {
  LL x;
  while (a != b && b != 0) {
    x = a;
    a = b;
    b = x % b;
  }
  return a;
}

struct st {
  // static vector<st> pool_st;
  static st * new_st(int a = 0, int b = C+5) {
    auto ret = new st;
    ret->a = a;
    ret->b = b;
    return ret;
    // pool_st.resize(pool_st.size() + 1);
    // pool_st.back().a = a;
    // pool_st.back().b = b;
    // return &pool_st.back();
  }
  int a, b;
  st * l = nullptr;
  st * r = nullptr;
  LL g = 0;
  st() {}
  ~st() {
    if (l) delete l;
    if (r) delete r;
  }
  friend void update(st * const n, const int p, const LL k) {
    if (p < n->a || n->b <= p) return;
    n->g = gcd(n->g, k);
    if (n) cerr << "st_update: " << "[" << n->a << " " << n->b << "), " << p << " " << k << " - g: " << n->g << endl;
    if (n->b - n->a <= 1) return;
    int m = (n->a+n->b) / 2;
    if (p < m) {
      if (!n->l) n->l = new_st(n->a, m);
      update(n->l, p, k);
      return;
    } else {
      if (!n->r) n->r = new_st(m, n->b);
      update(n->r, p, k);
      return;
    }
  }
  friend LL query(const st * const n, const int l, const int r) {
    if (!n || r <= n->a || n->b <= l) return 0LL;
    if (l <= n->a && n->b <= r) return n->g;
    return gcd(query(n->l, l, r), query(n->r, l, r));
  }
};

struct sst {
  static vector<sst> pool_sst;
  static sst * new_sst(int a = 0, int b = R+5) {
    auto ret = new sst;
    ret->a = a;
    ret->b = b;
    return ret;
    // pool_sst.resize(pool_sst.size() + 1);
    // pool_sst.back().a = a;
    // pool_sst.back().b = b;
    // return &pool_sst.back();
  }
  int a, b;
  sst * l = nullptr;
  sst * r = nullptr;
  st * son = nullptr;
  sst() {}
  ~sst() {
    if (l) delete l;
    if (r) delete r;
    if (son) delete son;
  }
  friend void sst_update(sst * const n, const int p, const int q, const LL k) {
    if (n) cerr << "sst_update: " << "[" << n->a << " " << n->b << "), " << p << " " << q << " " << k << endl;
    if (!n) cerr << "nope\n";
    if (p < n->a || n->b <= p) return;
    if (!n->son) n->son = st::new_st();
    update(n->son, q, k);
    if (n->b - n->a <= 1) return;
    int m = (n->a+n->b) / 2;
    if (p < m) {
      if (!n->l) n->l = new_sst(n->a, m);
      sst_update(n->l, p, q, k);
      return;
    } else {
      if (!n->r) n->r = new_sst(m, n->b);
      sst_update(n->r, p, q, k);
      return;
    }
  }
  friend LL sst_query(const sst * const n, const int p, const int q, const int u, const int v) {
    if (n) cerr << "sst_query: " << "[" << n->a << " " << n->b << "), " << p << " " << q << " " << u << " " << v << endl;
    if (!n) cerr << "nope\n";

    if (!n || u <= n->a || n->b <= p) return 0LL;
    if (p <= n->a && n->b <= u) return query(n->son, q, v);
    return gcd(sst_query(n->l, p, q, u, v), sst_query(n->r, p, q, u, v));
  }
};

// st::pool_st = vector<st>;
// sst::pool_sst = vector<sst>;
sst * root;

void cleanup() {
  delete root;
}

void init(int r, int c) {
  R = r+5; C = c+5;
  // root = sst::new_sst(0, r+5);
  root = sst::new_sst();
  assert(atexit(cleanup) == 0);
}

void update(int p, int q, LL k) {
  sst_update(root, p, q, k);
  cerr << endl;
}

long long calculate(int p, int q, int u, int v) {
  return sst_query(root, p, q, u+1, v+1);
}
#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...