Submission #313325

#TimeUsernameProblemLanguageResultExecution timeMemory
313325jc713Game (IOI13_game)C++17
100 / 100
4006 ms56952 KiB
#include "game.h" #include <bits/stdc++.h> using namespace std; using ll = long long; using ld = long double; using db = double; using str = string; // yay python! using pi = pair<int,int>; using pl = pair<ll,ll>; using pd = pair<db,db>; using vi = vector<int>; using vb = vector<bool>; using vl = vector<ll>; using vd = vector<db>; using vs = vector<str>; using vpi = vector<pi>; using vpl = vector<pl>; using vpd = vector<pd>; #define tcT template<class T // ^ lol this makes everything look weird but I'll try it tcT> using V = vector<T>; tcT, size_t SZ> using AR = array<T,SZ>; // pairs #define mp make_pair #define f first #define s second // vectors #define sz(x) (int)(x).size() #define all(x) begin(x), end(x) #define rall(x) (x).rbegin(), (x).rend() #define sor(x) sort(all(x)) #define rsz resize #define ins insert #define ft front() #define bk back() #define pf push_front #define pb push_back #define eb emplace_back #define lb lower_bound #define ub upper_bound // loops #define FOR(i,a,b) for (int i = (a); i < (b); ++i) #define F0R(i,a) FOR(i,0,a) #define ROF(i,a,b) for (int i = (b)-1; i >= (a); --i) #define R0F(i,a) ROF(i,0,a) #define trav(a,x) for (auto& a: x) const int MOD = 1e9+7; // 998244353; const int MX = 2e5+5; const ll INF = 1e18; // not too close to LLONG_MAX const ld PI = acos((ld)-1); const int xd[4] = {1,0,-1,0}, yd[4] = {0,1,0,-1}; // for every grid problem!! mt19937 rng((uint32_t)chrono::steady_clock::now().time_since_epoch().count()); // helper funcs constexpr int pct(int x) { return __builtin_popcount(x); } // # of bits set constexpr int bits(int x) { return 31-__builtin_clz(x); } // floor(log2(x)) ll cdiv(ll a, ll b) { return a/b+((a^b)>0&&a%b); } // divide a by b rounded up ll fdiv(ll a, ll b) { return a/b-((a^b)<0&&a%b); } // divide a by b rounded down tcT> bool ckmin(T& a, const T& b) { return b < a ? a = b, 1 : 0; } // set a = min(a,b) tcT> bool ckmax(T& a, const T& b) { return a < b ? a = b, 1 : 0; } #define tcTU tcT, class U tcTU> T fstTrue(T lo, T hi, U f) { hi ++; assert(lo <= hi); // assuming f is increasing while (lo < hi) { // find first index such that f is true T mid = lo+(hi-lo)/2; f(mid) ? hi = mid : lo = mid+1; } return lo; } tcTU> T lstTrue(T lo, T hi, U f) { lo --; assert(lo <= hi); // assuming f is decreasing while (lo < hi) { // find first index such that f is true T mid = lo+(hi-lo+1)/2; f(mid) ? lo = mid : hi = mid-1; } return lo; } tcT> void remDup(vector<T>& v) { // sort and remove duplicates sort(all(v)); v.erase(unique(all(v)),end(v)); } tcTU> void erase(T& t, const U& u) { // don't erase auto it = t.find(u); assert(it != end(t)); t.erase(u); } // element that doesn't exist from (multi)set // INPUT #define tcTUU tcT, class ...U tcT> void re(complex<T>& c); tcTU> void re(pair<T,U>& p); tcT> void re(vector<T>& v); tcT, size_t SZ> void re(AR<T,SZ>& a); tcT> void re(T& x) { cin >> x; } void re(db& d) { str t; re(t); d = stod(t); } void re(ld& d) { str t; re(t); d = stold(t); } tcTUU> void re(T& t, U&... u) { re(t); re(u...); } tcT> void re(complex<T>& c) { T a,b; re(a,b); c = {a,b}; } tcTU> void re(pair<T,U>& p) { re(p.f,p.s); } tcT> void re(vector<T>& x) { trav(a,x) re(a); } tcT, size_t SZ> void re(AR<T,SZ>& x) { trav(a,x) re(a); } // TO_STRING #define ts to_string str ts(char c) { return str(1,c); } str ts(const char* s) { return (str)s; } str ts(str s) { return s; } str ts(bool b) { #ifdef LOCAL return b ? "true" : "false"; #else return ts((int)b); #endif } tcT> str ts(complex<T> c) { stringstream ss; ss << c; return ss.str(); } str ts(vector<bool> v) { str res = "{"; F0R(i,sz(v)) res += char('0'+v[i]); res += "}"; return res; } template<size_t SZ> str ts(bitset<SZ> b) { str res = ""; F0R(i,SZ) res += char('0'+b[i]); return res; } tcTU> str ts(pair<T,U> p); tcT> str ts(T v) { // containers with begin(), end() #ifdef LOCAL bool fst = 1; str res = "{"; for (const auto& x: v) { if (!fst) res += ", "; fst = 0; res += ts(x); } res += "}"; return res; #else bool fst = 1; str res = ""; for (const auto& x: v) { if (!fst) res += " "; fst = 0; res += ts(x); } return res; #endif } tcTU> str ts(pair<T,U> p) { #ifdef LOCAL return "("+ts(p.f)+", "+ts(p.s)+")"; #else return ts(p.f)+" "+ts(p.s); #endif } // OUTPUT tcT> void pr(T x) { cout << ts(x); } tcTUU> void pr(const T& t, const U&... u) { pr(t); pr(u...); } void ps() { pr("\n"); } // print w/ spaces tcTUU> void ps(const T& t, const U&... u) { pr(t); if (sizeof...(u)) pr(" "); ps(u...); } // DEBUG void DBG() { cerr << "]" << endl; } tcTUU> void DBG(const T& t, const U&... u) { cerr << ts(t); if (sizeof...(u)) cerr << ", "; DBG(u...); } #ifdef LOCAL // compile with -DLOCAL, chk -> fake assert #define dbg(...) cerr << "Line(" << __LINE__ << ") -> [" << #__VA_ARGS__ << "]: [", DBG(__VA_ARGS__) #define chk(...) if (!(__VA_ARGS__)) cerr << "Line(" << __LINE__ << ") -> function(" \ << __FUNCTION__ << ") -> CHK FAILED: (" << #__VA_ARGS__ << ")" << "\n", exit(0); #else #define dbg(...) 0 #define chk(...) 0 #endif 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; } typedef struct tnode* pt; struct tnode { int pri, pos; pt c[2]; ll val, sum; tnode (int _pos, ll _val) { pos = _pos; pri = rng(); sum = val = _val; c[0] = c[1] = NULL; } }; ll getsum(pt x) { return x?x->sum:0; } pt calc(pt x) { pt a = x->c[0], b = x->c[1]; x->sum = gcd2(x->val,gcd2(getsum(a),getsum(b))); return x; } pair<pt,pt> split(pt t, int v) { // >= v goes to the right if (!t) return {t,t}; if (t->pos >= v) { auto p = split(t->c[0], v); t->c[0] = p.s; return {p.f,calc(t)}; } else { auto p = split(t->c[1], v); t->c[1] = p.f; return {calc(t),p.s}; } } pt merge(pt l, pt r) { // merge treaps, keys in left < keys in right if (!l || !r) return l?:r; pt t; if (l->pri > r->pri) l->c[1] = merge(l->c[1],r), t = l; else r->c[0] = merge(l,r->c[0]), t = r; return calc(t); } pt ins(pt x, int p, ll v) { // insert v auto a = split(x,p), b = split(a.s,p+1); return merge(a.f,merge(new tnode(p, v),b.s)); } ll ql(pt x, int L){ if(!x) return 0; if(x->pos < L) return ql(x->c[1], L); else return gcd2(x->val, gcd2(getsum(x->c[1]), ql(x->c[0], L))); } ll qr(pt x, int R){ if(!x) return 0; if(x->pos > R) return qr(x->c[0], R); else return gcd2(x->val, gcd2(getsum(x->c[0]), qr(x->c[1], R))); } ll qu(pt x, int L, int R){ if(!x) return 0; if(x->pos < L) return qu(x->c[1], L, R); if(x->pos > R) return qu(x->c[0], L, R); return gcd2(x->val, gcd2(ql(x->c[0], L), qr(x->c[1], R))); } const int SZ = 1e9+10; template<class T> struct Node { pt treap; Node* c[2]; Node() { c[0] = c[1] = NULL; treap = NULL; } void upd(int x, int y, T v, int L = 0, int R = SZ-1) { // add v if (L == x && R == x) { treap = ins(treap,y,v); return; } int M = (L+R)/2; if (x <= M) { if (!c[0]) c[0] = new Node(); c[0]->upd(x,y,v,L,M); } else { if (!c[1]) c[1] = new Node(); c[1]->upd(x,y,v,M+1,R); } ll nxt = 0; if(c[0]) nxt = gcd2(nxt, qu(c[0]->treap, y, y)); if(c[1]) nxt = gcd2(nxt, qu(c[1]->treap, y, y)); treap = ins(treap, y, nxt); } T query(int x1, int x2, int y1, int y2, int L = 0, int R = SZ-1) { // query sum of rectangle if (x1 <= L && R <= x2) return qu(treap,y1,y2); if (x2 < L || R < x1) return 0; int M = (L+R)/2; T res = 0; if (c[0]) res = gcd2(res, c[0]->query(x1,x2,y1,y2,L,M)); if (c[1]) res = gcd2(res, c[1]->query(x1,x2,y1,y2,M+1,R)); return res; } }; Node<ll>* tr = new Node<ll>(); void init(int R, int C) { /* ... */ } void update(int P, int Q, long long K) { /* ... */ tr->upd(P, Q, K); } long long calculate(int P, int Q, int U, int V) { /* ... */ return tr->query(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...