Submission #7228

#TimeUsernameProblemLanguageResultExecution timeMemory
7228RhakGame (IOI13_game)C++98
0 / 100
0 ms1216 KiB
#include "game.h" long long gcd2(long long x, long long y){ return y==0? x: gcd2(y, x%y); } struct _node{ _node *left, *right; long long GCD; _node(long long GCD):GCD(GCD){ left = right = 0; } }; struct _IndexTree{ int S, E; _node *root; _IndexTree(int S,int E):S(S), E(E){ root = new _node(0);} void update(_node* n, int s, int e, int p, long long N) { if( p < s || e < p) return; else if( p == s && e == p){ n->GCD = N; return; } int m = (s+e) >> 1; long long t1 = n->left? n->left->GCD:0, t2 = n->right? n->right->GCD:0; if( p <= m ){ if( !n->left ) n->left = new _node(0); update(n->left, s, m, p, N); t1 = n->left->GCD; } else{ if( !n->right ) n->right = new _node(0); update(n->right, m+1, e, p, N); t2 = n->right->GCD; } n->GCD = gcd2(t1,t2); } void update(int p, long long N) { update(root, S, E, p, N); } long long read(_node *n, int s, int e, int p, int q) { if( !n ) return 0; if( q < s || e < p) return 0; else if( p <= s && e <= q){ return n->GCD; } int m = (s+e) >> 1; long long t1 = n->left? read(n->left, s, m, p, q):0; long long t2 = n->right? read(n->right, m+1, e, p, q):0; return gcd2(t1, t2); } long long read(int s,int e){ return read(root, S, E, s, e); } }; struct node{ node *left, *right; _IndexTree *IT; node(int C){ left = right = 0; IT = new _IndexTree(0, C-1); } }; struct IndexTree{ int S, E, C; node* root; IndexTree(int S, int E, int C):S(S), E(E), C(C){ root = new node(C); } void update(node* n, int s, int e, int p, int q, long long N) { if( p < s || e < p) return; n->IT->update(q, N); if( p == s && e == p) return; int m = (s+e) >> 1; if( p <= m ){ if( !n->left ) n->left = new node(C); update(n->left, s, m, p, q, N); } else{ if( !n->right ) n->right = new node(C); update(n->right, m+1, e, p, q, N); } } void update(int p, int q, long long N) { update(root, S, E, p, q, N); } long long read(node *n, int s, int e, int p, int q, int u, int v) { if( !n ) return 0; if( q < s || e < p) return 0; else if( p <= s && e <= q){ return n->IT->read(u, v); } int m = (s+e) >> 1; long long t1 = n->left? read(n->left, s, m, p, q, u, v):0; long long t2 = n->right? read(n->right, m+1, e, p, q, u, v):0; return gcd2(t1, t2); } long long read(int P,int Q,int U, int V) { return read(root, S, E, P, Q, U, V); } }*IT; void init(int R, int C){ IT = new IndexTree(0, R-1, C); } void update(int R, int C, long long K){ IT->update(R, C, K); } long long calculate(int P, int Q, int U, int V){ return IT->read(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...