Submission #1013224

#TimeUsernameProblemLanguageResultExecution timeMemory
1013224parsadox2Game (IOI13_game)C++17
80 / 100
5089 ms256000 KiB
#include "game.h" #include <bits/stdc++.h> using namespace std; const int N = 1e9 + 2; int s , e; 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 SEG{ struct NODE{ int lc , rc; long long g; NODE(){ lc = 0; rc = 0; g = 0; } }; vector <NODE> t; NODE emp; void Build() { t.emplace_back(emp); t.emplace_back(emp); } void Set(int id , long long vl) { int nd = 1 , nl = 0 , nr = N; vector <int> vec; while(nr - nl != 1) { vec.push_back(nd); int mid = (nl + nr) >> 1; if(id < mid) { if(t[nd].lc == 0) { t[nd].lc = t.size(); t.emplace_back(emp); } nd = t[nd].lc; nr = mid; } else { if(t[nd].rc == 0) { t[nd].rc = t.size(); t.emplace_back(emp); } nd = t[nd].rc; nl = mid; } } t[nd].g = vl; while(!vec.empty()) { nd = vec.back(); t[nd].g = gcd2(t[t[nd].lc].g , t[t[nd].rc].g); vec.pop_back(); } } /*void Set(int id , long long vl , int node = 1 , int nl = 0 , int nr = N) { int nd = node; if(nr - nl == 1) { t[nd].g = vl; return; } int mid = (nl + nr) >> 1; if(id < mid) { if(t[nd].lc == 0) { t[nd].lc = t.size(); t.emplace_back(emp); } Set(id , vl , t[nd].lc , nl , mid); } else { if(t[nd].rc == 0) { t[nd].rc = t.size(); t.emplace_back(emp); } Set(id , vl , t[nd].rc , mid , nr); } t[nd].g = gcd2(t[t[nd].lc].g , t[t[nd].rc].g); }*/ long long Get(int node = 1 , int nl = 0 , int nr = N) { if(e <= nl || nr <= s) return 0; if(s <= nl && nr <= e) return t[node].g; int mid = (nl + nr) >> 1; return gcd2(Get(t[node].lc , nl , mid) , Get(t[node].rc , mid , nr)); } }; struct SEG2{ struct NODE{ int lc , rc; SEG s; }; NODE emp; vector <NODE> t; void Build() { emp.s.Build(); emp.lc = 0; emp.rc = 0; t.emplace_back(emp); t.emplace_back(emp); } void Set(int id , int a , long long b , int node = 1 , int nl = 0 , int nr = N) { int nd = node; if(nr - nl == 1) { t[nd].s.Set(a , b); return; } int mid = (nl + nr) >> 1; if(id < mid) { if(t[nd].lc == 0) { t[nd].lc = t.size(); t.emplace_back(emp); } Set(id , a , b , t[nd].lc , nl , mid); } else { if(t[nd].rc == 0) { t[nd].rc = t.size(); t.emplace_back(emp); } Set(id , a , b , t[nd].rc , mid , nr); } t[nd].s.Set(a , gcd2(t[t[nd].lc].s.Get() , t[t[nd].rc].s.Get())); } long long Get(int l , int r , int node = 1 , int nl = 0 , int nr = N) { if(r <= nl || nr <= l) return 0; if(l <= nl && nr <= r) { long long x = t[node].s.Get(); return x; } int mid = (nl + nr) >> 1; return gcd2(Get(l , r , t[node].lc , nl , mid) , Get(l , r , t[node].rc , mid , nr)); } } seg; void init(int R, int C) { seg.Build(); } void update(int P, int Q, long long K) { s = Q; e = Q + 1; seg.Set(P , Q , K); } long long calculate(int P, int Q, int U, int V) { int l = min(P , U) , r = max(P , U); s = min(Q , V); e = max(Q , V) + 1; return seg.Get(l , r + 1); } /*signed main() { int R, C, N; int P, Q, U, V; long long K; int i, type; assert(scanf("%d", &R) == 1); assert(scanf("%d", &C) == 1); assert(scanf("%d", &N) == 1); init(R, C); std::vector<long long> answers; for (i = 0; i < N; i++) { assert(scanf("%d", &type) == 1); if (type == 1) { assert(scanf("%d%d%lld", &P, &Q, &K) == 3); update(P, Q, K); } else if (type == 2) { assert(scanf("%d%d%d%d", &P, &Q, &U, &V) == 4); answers.emplace_back(calculate(P, Q, U, V)); } } for (auto answer: answers) { printf("%lld\n", answer); } return 0; }*/ /* 2 3 4 1 0 0 20 1 0 2 15 1 1 1 12 2 0 0 1 1 */
#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...