Submission #587411

#TimeUsernameProblemLanguageResultExecution timeMemory
587411FatihSolak게임 (IOI13_game)C++17
10 / 100
13099 ms4732 KiB
#include "game.h"
#include <bits/stdc++.h>
#define CNT (int)2e7
#define CNT2 (int)1e6
using namespace std;
long long gcd2(long long X, long long Y) {
  long long tmp;
  while (X != Y && Y != 0) {
    tmp = X;
    X = Y;
    Y = tmp % Y;
  }
  return X;
}
struct node{
  int l = 0,r = 0;
  long long val = 0;
}nodes[CNT];
int cnt = 1;
struct SegTree{
  int root = -1;
  void upd(int v,int tl,int tr,int pos,long long val){
    if(tl == tr){
      nodes[v].val = val;
      return;
    }
    int tm = (tl + tr)/2;
    if(pos <= tm){
      if(nodes[v].l == 0)
        nodes[v].l = cnt++;
      upd(nodes[v].l,tl,tm,pos,val);
    }
    else{
      if(nodes[v].r == 0)
        nodes[v].r = cnt++;
      upd(nodes[v].r,tm+1,tr,pos,val);
    }
    nodes[v].val = __gcd(nodes[nodes[v].l].val,nodes[nodes[v].r].val);
  }
  long long get(int v,int tl,int tr,int l,int r){
    if(v == 0 || tr < l || r < tl)
      return 0;
    if(l <= tl && tr <= r){
      return nodes[v].val;
    }
    int tm = (tl + tr)/2;
    return __gcd(get(nodes[v].l,tl,tm,l,r),get(nodes[v].r,tm+1,tr,l,r));
  }
  void upd(int pos,long long val){
    if(root == -1)
      root = cnt++;
    upd(root,1,1e9,pos,val);
  }
  long long get(int l,int r){
    if(root == -1)
      return 0;
    return get(root,1,1e9,l,r);
  }
};
map<int,int> mp;
int cntmp = 1;
SegTree numbers[22005];
struct node2{
  int l = 0,r = 0;
  SegTree val;
}nodes2[CNT2];
int cnt2 = 1;
struct SegTree2D{
  int root = -1;
  void upd(int v,int tl,int tr,int x,int y,long long val){
    nodes2[v].val.upd(y,numbers[mp[y]].get(tl,tr));
    if(tl == tr){
      return;
    }
    int tm = (tl + tr)/2;
    if(x <= tm){
      if(nodes2[v].l == 0)
        nodes2[v].l = cnt2++;
      upd(nodes2[v].l,tl,tm,x,y,val);
    }
    else{
      if(nodes2[v].r == 0)
        nodes2[v].r = cnt2++;
      upd(nodes2[v].r,tm+1,tr,x,y,val);
    }
  }
  long long get(int v,int tl,int tr,int l,int r,int l2,int r2){
    if(v == 0 || tr < l || r < tl)
      return 0;
    if(l <= tl && tr <= r){
      return nodes2[v].val.get(l2,r2);
    }
    int tm = (tl + tr)/2;
    return __gcd(get(nodes2[v].l,tl,tm,l,r,l2,r2),get(nodes2[v].r,tm+1,tr,l,r,l2,r2));
  }
  void upd(int x,int y,long long val){
    if(root == -1)
      root = cnt2++;
    upd(root,1,1e9,x,y,val);
  }
  long long get(int l,int r,int l2,int r2){
    if(root == -1)
      root = cnt2++;
    return get(root,1,1e9,l,r,l2,r2);
  }
}tree;
int p1[22005],p2[22005];
long long p3[22005];
int sz = 0;
void init(int R, int C) {
  //tree.init(R,C);
}
int update_cnt = 0;
int limit = 0;
void update(int P, int Q, long long K) {
  P++,Q++;
  update_cnt++;
  bool ok = 1;
  for(int i = 0;i<sz;i++){
    if(p1[i] == P && p2[i] == Q){
      p3[i] = K;
      ok = 0;
    }
  }
  if(ok){
    p1[sz] = P;
    p2[sz] = Q;
    p3[sz] = K;
    sz++;
  }
  if(update_cnt <= limit){
    if(mp[Q] == 0){
      mp[Q] =  cntmp++;
    }
    numbers[mp[Q]].upd(P,K);
    tree.upd(P,Q,K);
  }

}

long long calculate(int P, int Q, int U, int V) {
  P++,Q++,U++,V++;
  assert(cnt < CNT);
  assert(cnt2 < CNT2);
  if(update_cnt <= limit)
    return tree.get(P,U,Q,V);
  long long g = 0;
  for(int i = 0;i<sz;i++){
    if(P <= p1[i] && p1[i] <= U && Q <= p2[i] && p2[i] <= V){
      g = __gcd(g,p3[i]);
    }
  }
  return g;
}
#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...