제출 #1181228

#제출 시각아이디문제언어결과실행 시간메모리
1181228n3rm1n게임 (IOI13_game)C++17
0 / 100
0 ms328 KiB
#include<iostream> #include "game.h" using namespace std; /// struct struct Tnode { long long val; Tnode *l, *r; Tnode() { val = 0; l = NULL; r = NULL; } }; struct Tree { Tnode *node; Tree *l, *r; Tree() { node = NULL; l = NULL; r = NULL; } }; Tree *root = NULL; int r, c; int qL, qR, ql, qr; long long updPos, updpos, updvalue; long long gcd(long long x, long long y) { while (x && y) { if(x > y)x %= y; else y %= x; } return x + y; } /// query long long query(Tnode *t, int l, int r) { if(qr < l && ql > r)return 0; if(r < l)return 0; if(t == NULL)return 0; if(ql <= l && r <= qr)return t -> val; int mid = (l + r)/2; long long fhalf = query(t -> l, l, mid); long long shalf = query(t -> r, mid+1, r); return gcd(fhalf, shalf); } long long Query(Tree *t, int l, int r) { if(qR < l || qL > r)return 0; if(r < l)return 0; if(t == NULL)return 0; if(qL <= l && r <= qR) { return query(t -> node, 0, c-1); } int mid = (l + r)/2; long long fhalf = Query(t -> l, l, mid); long long shalf = Query(t -> r, mid+1, r); return gcd(fhalf, shalf); } /// update long long merge0(Tnode *&t0, Tnode *&t1) { if(t0 == NULL && t1 == NULL)return 0; if(t0 == NULL)return t1 -> val; if(t1 == NULL)return t0 -> val; return gcd(t0 -> val, t1 -> val); } void upd(Tnode *&t, int l, int r) { if(t == NULL)t = new Tnode; if(l == r) { t -> val = updvalue; return; } int mid = (l + r)/2; if(updpos <= mid)upd(t -> l, l, mid); else upd(t -> r, mid+1, r); t -> val = merge0(t -> l, t -> r); } Tnode *getValue(Tree *&t) { if(t == NULL)return NULL; else return t -> node; } long long getvalue(Tnode *&t) { if(t == NULL)return 0; return t -> val; } void Merge(Tnode *&t, Tnode *&t0, Tnode *&t1, int l, int r) { if(t == NULL)t = new Tnode; if(l == r) { t -> val = gcd(getvalue(t0), getvalue(t1)); return; } int mid = (l + r)/2; if(updpos <= mid) { if(t1 != NULL)t1 = t1 -> l; if(t0 != NULL)t0 = t0 -> l; Merge(t ->l, t0, t1, l, mid); } else { if(t1 != NULL)t1 = t1 -> r; if(t0 != NULL)t0 = t0 -> r; Merge(t -> r, t0, t1, mid+1, r); } t -> val = gcd(getvalue(t0), getvalue(t1)); } void Update(Tree *t, int l, int r) { if(t == NULL)t = new Tree(); if(l == r) { upd(t -> node, 0, c-1); return; } int mid = (l + r)/2; if(updPos <= mid)Update(t -> l, l, mid); else Update(t -> r, mid+1, r); } void init(int R, int C) { r = R; c = C; } void update(int P, int Q, long long K) { updPos = P; updpos = Q; updvalue = K; Update(root, 0, r-1); } long long calculate(int P, int Q, int U, int V) { qL = P; qR = U; ql = Q; qr = V; long long ans = Query(root, 0, r-1); return ans; }
#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...