Submission #1246568

#TimeUsernameProblemLanguageResultExecution timeMemory
1246568aykhnGame (IOI13_game)C++20
36 / 100
1119 ms128492 KiB
#include "game.h"
#include <bits/stdc++.h>

using namespace std;

const int MXN = 2e3 + 5;

int n, m;
long long st[MXN << 2][MXN << 2];

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...