Submission #898004

#TimeUsernameProblemLanguageResultExecution timeMemory
898004Faisal_SaqibGame (IOI13_game)C++17
37 / 100
13050 ms8276 KiB
#include "game.h" #include <iostream> #include <numeric> #include <set> using namespace std; const int N=2001; struct SegmentTree { long long gdc=0; int s,e; SegmentTree* next[2]; SegmentTree(int l,int r) { s=l; e=r; next[0]=next[1]=NULL; } long long get(int& l,int& r) { if(e<l or r<s) return 0; if(l<=s and e<=r) return gdc; long long ans=0; if(next[0]!=NULL) ans=gcd(ans,next[0]->get(l,r)); if(next[1]!=NULL) ans=gcd(ans,next[1]->get(l,r)); return ans; } void Update(int& l,long long& val) { if(s==e) { if(s==l) gdc=val; return; } if(l<=((s+e)/2)) { if(next[0]==NULL) next[0]=new SegmentTree(s,(s+e)/2); next[0]->Update(l,val); } else { if(next[1]==NULL) next[1]=new SegmentTree(1+((s+e)/2),e); next[1]->Update(l,val); } gdc=0; if(next[0]!=NULL) gdc=gcd(next[0]->gdc,gdc); if(next[1]!=NULL) gdc=gcd(next[1]->gdc,gdc); } }; SegmentTree* st[N]; int R,C; set<int> have; void init(int r, int c) { R=r; C=c; } void update(int p, int q, long long k) { have.insert(p); if(st[p]==NULL) st[p]=new SegmentTree(0,C-1); st[p]->Update(q,k); } long long calculate(int P, int Q, int U, int V) { long long ans=0; // for(;P<=U;P++) int sta=P-1; while(1) { auto it =have.upper_bound(sta); if(it==have.end() or (*it)>U) break; sta=*it; if(st[sta]!=NULL) ans=gcd(ans,st[sta]->get(Q,V)); if(ans==1) return 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...