Submission #645587

#TimeUsernameProblemLanguageResultExecution timeMemory
645587abekerGame (IOI13_game)C++17
0 / 100
2 ms852 KiB
#include <bits/stdc++.h>
#include "game.h"
using namespace std;

typedef long long ll;

const int offset = 1 << 30;

struct ColumnNode {
  ll num;
  ColumnNode *l, *r;
  ColumnNode() : num(0), l(nullptr), r(nullptr) {}
};

struct RowNode {
  ColumnNode* root;
  RowNode *l, *r;
  RowNode() : root(new ColumnNode()), l(nullptr), r(nullptr) {}
};

ll gcd(ll a, ll b) {
  return b ? gcd(b, a % b) : a;
}

RowNode* row_root;

void init(int R, int C) {
  row_root = new RowNode();
}

void update_col(ColumnNode *x, int lo, int hi, int col, ll val) {
  if (col < lo || col >= hi)
    return;
  if (hi - lo == 1) {
    x -> num = val;
    return;
  }
  int mid = (lo + hi) / 2;
  if (!(x -> l))
    x -> l = new ColumnNode();
  if (!(x -> r))
    x -> r = new ColumnNode();
  update_col(x -> l, lo, mid, col, val);
  update_col(x -> r, mid, hi, col, val);
  x -> num = gcd(x -> l -> num, x -> r -> num);
}

void update_row(RowNode* x, int lo, int hi, int row, int col, ll val) {
  update_col(x -> root, 0, offset, col, val);
  if (hi - lo == 1)
    return;
  int mid = (lo + hi) / 2;
  if (row < mid) {
    if (!(x -> l))
      x -> l = new RowNode();
    update_row(x -> l, lo, mid, row, col, val);
  }
  else {
    if (!(x -> r))
      x -> r = new RowNode();
    update_row(x -> r, mid, hi, row, col, val);
  }
}

void update(int p, int q, ll k) {
  update_row(row_root, 0, offset, p, q, k);
}

ll query_col(ColumnNode* x, int lo, int hi, int from, int to) {
  if (!x || lo >= to || hi <= from)
    return 0;
  if (lo >= from && hi <= to)
    return x -> num;
  int mid = (lo + hi) / 2;
  return gcd(query_col(x -> l, lo, mid, from, to), query_col(x -> r, mid, hi, from, to));
}

ll query_row(RowNode* x, int lo, int hi, int from, int to, int col1, int col2) {
  if (!x || lo >= to || hi <= from)
    return 0;
  if (lo >= from && hi <= to)
    return query_col(x -> root, 0, offset, col1, col2);
  int mid = (lo + hi) / 2;
  return gcd(query_row(x -> l, lo, mid, from, to, col1, col2), query_row(x -> r, mid, hi, from, to, col1, col2));
}

ll calculate(int p, int q, int u, int v) {
  return query_row(row_root, 0, offset, p, u + 1, q, 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...