Submission #1128358

#TimeUsernameProblemLanguageResultExecution timeMemory
1128358idiotcomputerGame (IOI13_game)C++17
0 / 100
1 ms324 KiB
#include "game.h" #include <bits/stdc++.h> using namespace std; #define ll long long int #define f first #define s second ll gcd(ll a, ll b){ if (a == 0) return b; return gcd(b%a,a); } using sn = struct node*; const int low = 0; const int high = 1e9; struct node { int l,r; bool w; ll val = 0; sn c[2] = {nullptr,nullptr}; sn root = nullptr; node(int il, int ir, bool iw){ l = il; r = ir; w = iw; } }; void upd(sn cur, int x, int y, ll v, bool rep = 0){ int l = (*cur).l; int r = (*cur).r; if ((*cur).w){ //cout << l << "," << r << "\n"; //y if (l == r && rep) { (*cur).val = v; return;} (*cur).val = gcd((*cur).val, v); if (l == r) return; int m = (l+r)/2; if (y <= m) { if ((*cur).c[0] == nullptr) (*cur).c[0] = new node(l,m,1); upd((*cur).c[0],x,y,v); } else { if ((*cur).c[1] == nullptr) (*cur).c[1] = new node(m+1,r,1); upd((*cur).c[1],x,y,v); } } else { //x if ((*cur).root == nullptr) (*cur).root = new node(low,high,1); upd((*cur).root,x,y,v,(l==r)); //cout << l << ',' << r << " " << x << "-" << y << "\n"; if (l == r) return; int m = (l+r)/2; if (x <= m) { if ((*cur).c[0] == nullptr) (*cur).c[0] = new node(l,m,0); upd((*cur).c[0],x,y,v); } else { if ((*cur).c[1] == nullptr) (*cur).c[1] = new node(m+1,r,0); upd((*cur).c[1],x,y,v); } } } ll query(sn cur, int x1, int x2, int y1, int y2){ int l = (*cur).l; int r = (*cur).r; //cout << "Q - " << l << ',' << r << " " << (*cur).w << ' ' << (*cur).val << '\n'; //cout << x1 << ',' << x2 << " " << y1 << ',' << y2 << '\n'; if ((*cur).w){ //y ll res = 0; //cout << "CONTINUING\n"; if (l >= y1 && r <= y2) return (*cur).val; //cout << "CONTINUING\n"; if (l > y2 || r < y1) return 0; if ((*cur).c[0] != nullptr) res = gcd(res,query((*cur).c[0],x1,x2,y1,y2)); if ((*cur).c[1] != nullptr) res = gcd(res,query((*cur).c[1],x1,x2,y1,y2)); return res; } else { //x ll res = 0; if (l >= x1 && r <= x2){ if ((*cur).root != nullptr) res = query((*cur).root,x1,x2,y1,y2); return res; } if (l > x2 || r < x1) return 0; if ((*cur).c[0] != nullptr) res = gcd(res,query((*cur).c[0],x1,x2,y1,y2)); if ((*cur).c[1] != nullptr) res = gcd(res,query((*cur).c[1],x1,x2,y1,y2)); return res; } } sn groot = nullptr; void init(int R, int C){ groot = new node(low,high,0); } void update(int P, int Q, ll K){ upd(groot,Q,P,K); } ll calculate(int P, int Q, int U, int V){ return query(groot,Q,V,P,U); } /* int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int r,c,n; cin >> r >> c >> n; init(r,c); int t,u,v,a,b; //cout << calculate(0,0,10,10) << '\n'; for (int i = 0; i < n; i++){ cin >> t; if (t == 1){ cin >> u >> v >> a; update(u,v,a); //cout << calculate(0,0,10,10) << '\n'; } else { cin >> u >> v >> a >> b; cout << calculate(u,v,a,b) << '\n'; } } return 0; } */
#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...