Submission #15777

#TimeUsernameProblemLanguageResultExecution timeMemory
15777aintaGame (IOI13_game)C++98
63 / 100
3425 ms256000 KiB
#include "game.h" #include<stdio.h> #include<algorithm> 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 SegY{ long long G; SegY *c1, *c2; SegY(){ G=0; c1=c2=NULL; } }; struct SegX{ long long G; SegX *c1, *c2; SegY *cy; SegX(){ G=0; c1=c2=NULL; cy=NULL; } }; SegX *rootX; SegY *rootY; int MR, MC; void init(int R, int C) { rootX = new SegX(); rootY = new SegY(); MR = R, MC = C; } void InsY(SegY *nd, int b, int e, int y, long long K){ if(b==e){ nd->G = K; return; } int m = (b+e)>>1; if(!nd->c1){ nd->c1 = new SegY(); nd->c2 = new SegY(); } if(y <= m)InsY(nd->c1, b, m, y, K); else InsY(nd->c2, m+1, e, y, K); nd->G = gcd2(nd->c1->G, nd->c2->G); } void UDT(SegY *nd, SegY *nd1, SegY *nd2, int b, int e, int y){ nd->G = gcd2(nd1?nd1->G:0, nd2?nd2->G:0); if(b==e)return; int m = (b+e)>>1; if(!nd->c1)nd->c1 = new SegY(), nd->c2 = new SegY(); if(y <= m)UDT(nd->c1, nd1?nd1->c1:NULL, nd2?nd2->c1:NULL, b, m, y); else UDT(nd->c2, nd1?nd1->c2:NULL, nd2?nd2->c2:NULL, m+1, e, y); } void InsX(SegX *nd, int b, int e, int x, int y, long long K){ if(b==e){ if(!nd->cy)nd->cy = new SegY(); InsY(nd->cy, 0, MC - 1, y, K); return; } int m = (b+e)>>1; if(!nd->c1)nd->c1 = new SegX(), nd->c2 = new SegX(); if(!nd->cy)nd->cy = new SegY(); if(x <= m) InsX(nd->c1, b, m, x, y, K); else InsX(nd->c2, m+1, e, x, y, K); UDT(nd->cy, nd->c1->cy, nd->c2->cy, 0, MC - 1, y); } void update(int P, int Q, long long K) { InsX(rootX, 0, MR - 1, P, Q, K); } long long CalcY(SegY *nd, int b, int e, int s, int l){ if(!nd)return 0; if(b == s && e == l)return nd->G; int m = (b+e)>>1; long long r = 0; if(s <= m && nd->c1) r = CalcY(nd->c1, b, m, s, min(m,l)); if(l > m && nd->c2) r = gcd2(CalcY(nd->c2, m + 1, e, max(s, m+1), l), r); return r; } long long CalcX(SegX *nd, int b, int e, int s, int l, int by, int ey){ if(b == s && e == l)return CalcY(nd->cy, 0, MC - 1, by, ey); int m = (b+e)>>1; long long r = 0; if(s <= m && nd->c1) r = CalcX(nd->c1, b, m, s, min(m,l), by, ey); if(l > m && nd->c2) r = gcd2(CalcX(nd->c2, m+1, e, max(m+1, s), l, by, ey), r); return r; } long long calculate(int P, int Q, int U, int V) { return CalcX(rootX, 0, MR - 1, P, U, Q, 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...