Submission #477751

#TimeUsernameProblemLanguageResultExecution timeMemory
477751andrey27_smGame (IOI13_game)C++17
63 / 100
1523 ms256004 KiB
#include "game.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; ll c, rl; struct Node{ Node* lS; Node* rS; ll val; Node(){ val = 0; lS = nullptr; rS = nullptr; } }; ll gcd(ll x,ll y){ if(x == 0 or y == 0) return max(x,y); return __gcd(x,y); } ll get_val(Node *v){ if(v == nullptr) return 0; return v->val; } struct NodeST{ Node root; void update(Node* v,ll l,ll r,ll t,ll val){ if (l == r){ (v->val) = val; return; } ll m = (l+r)/2; if (t <= m){ if (v->lS == nullptr) v->lS = new Node(); update(v->lS,l,m,t,val); }else{ if (v->rS == nullptr) v->rS = new Node(); update(v->rS,m+1,r,t,val); } v->val = gcd(get_val(v->lS),get_val(v->rS)); } ll get(Node *v,ll l,ll r,ll tl,ll tr){ if(v == nullptr or r < tl or tr < l) return 0; if(tl <= l and r <= tr) { return v->val; } ll m = (l+r)/2; return gcd(get(v->rS,m+1,r,tl,tr),get(v->lS,l,m,tl,tr)); } void update(ll t,ll val){ return update(&root,0,c,t,val); } ll get(ll tl,ll tr){ return get(&root,0,c,tl,tr); } NodeST(){ root = *new Node(); } }; struct Node2{ Node2 *lS; Node2 *rS; NodeST val; Node2(){ lS = nullptr; rS = nullptr; val = *new NodeST(); } }; void update(Node2* v,ll l,ll r,ll x,ll y,ll val){ if (l == r){ (v->val).update(y,val); return; } ll m = (l+r)/2; if (x <= m){ if (v->lS == nullptr) v->lS = new Node2(); update(v->lS,l,m,x,y,val); }else{ if (v->rS == nullptr) v->rS = new Node2(); update(v->rS,m+1,r,x,y,val); } ll new_val = 0; if(v->lS) new_val=gcd(new_val,(v->lS)->val.get(y,y)); if(v->rS) new_val=gcd(new_val,(v->rS)->val.get(y,y)); v->val.update(y,new_val); } ll get(Node2 *v,ll l,ll r,ll xl,ll xr,ll yl,ll yr){ if(v == nullptr or r < xl or xr < l) return 0; if(xl <= l and r <= xr) { return (v->val).get(yl,yr); } ll m = (l+r)/2; return gcd(get(v->lS,l,m,xl,xr,yl,yr),get(v->rS,m+1,r,xl,xr,yl,yr)); } Node2 root; void updates(ll x,ll y,ll val){ update(&root,0,rl,x,y,val); } ll get(ll xl,ll xr,ll yl,ll yr){ return get(&root,0,rl,xl,xr,yl,yr); } /* int main() { int R,C,n; cin >> R >> C >> n; rl = R+1; c = C+1; for (int i = 0; i < n; ++i) { int type = 0; cin >> type; if(type == 1){ int x,y,t; cin >> x >> y >> t; updates(x,y,t); } else{ int x1,x2,y1,y2; cin >> x1 >> y1 >> x2 >> y2; cout << get(x1,x2,y1,y2) << "\n"; } } return 0; } */ void init(int R,int C){ rl = R+1; c = C+1; root = *new Node2(); } void update(int P,int Q,ll K){ updates(P,Q,K); } ll calculate(int P,int Q,int U,int V){ return get(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...