Submission #1246572

#TimeUsernameProblemLanguageResultExecution timeMemory
1246572aykhnGame (IOI13_game)C++20
37 / 100
8818 ms267396 KiB
#include "game.h"
#include <bits/stdc++.h>

using namespace std;

const int MXN = 2e3 + 5;

int n, m;
map<array<int, 2>, long long> st;

void init(int R, int C) {
  n = R, m = C;
}

void updy(int l, int r, int x, int node, int leaf, int ind, long long val)
{
  if (l == r)
  {
    if (leaf) st[{node, x}] = val;
    else st[{node, x}] = gcd(st[{2*node, x}], st[{2*node + 1, x}]);
    return;
  }
  int mid = (l + r) >> 1;
  if (ind <= mid) updy(l, mid, 2*x, node, leaf, ind, val);
  else updy(mid + 1, r, 2*x + 1, node, leaf, ind, val);
  st[{node, x}] = gcd(st[{node, 2*x}], st[{node, 2*x + 1}]);
}
void updx(int l, int r, int x, int qx, int qy, long long val)
{
  if (l != r)
  {
    int mid = (l + r) >> 1;
    if (qx <= mid) updx(l, mid, 2*x, qx, qy, val);
    else updx(mid + 1, r, 2*x + 1, qx, qy, val);
  }
  updy(0, m - 1, 1, x, (l == r), qy, val);
}
long long gety(int l, int r, int x, int node, int y1, int y2)
{
  if (l > y2 || r < y1) return 0;
  if (l >= y1 && r <= y2) return st[{node, x}];
  int mid = (l + r) >> 1;
  return gcd(gety(l, mid, 2*x, node, y1, y2), gety(mid + 1, r, 2*x + 1, node, y1, y2));
}
long long getx(int l, int r, int x, int x1, int y1, int x2, int y2)
{
  if (l > x2 || r < x1) return 0;
  if (l >= x1 && r <= x2) return gety(0, m - 1, 1, x, y1, y2);
  int mid = (l + r) >> 1;
  return gcd(getx(l, mid, 2*x, x1, y1, x2, y2), getx(mid + 1, r, 2*x + 1, x1, y1, x2, y2));
}
void update(int P, int Q, long long K) {
  updx(0, n - 1, 1, P, Q, K);
}

long long calculate(int P, int Q, int U, int V) {
  return getx(0, n - 1, 1, P, Q, U, V);
}
#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...