제출 #659304

#제출 시각아이디문제언어결과실행 시간메모리
659304Danilo21게임 (IOI13_game)C++17
80 / 100
3409 ms162104 KiB
        #include <bits/stdc++.h>
        #include "game.h"

        #define ll long long
        #define ld long double
        #define pb push_back
        #define fi first
        #define se second
        #define en '\n'
        #define sp ' '
        #define tb '\t'
        #define ri(n) int n; cin >> n
        #define rl(n) ll n; cin >> n
        #define rs(s) string s; cin >> s
        #define rc(c) char c; cin >> c
        #define rv(v) for (auto &x : v) cin >> x
        #define pven(v) for (auto x : v) cout << x << en
        #define pv(v) for (auto x : v) cout << x << sp; cout << en
        #define all(v) v.begin(), v.end()
        #define rall(v) v.rbegin(), v.rend()
        #define yes cout << "YES" << en
        #define no cout << "NO" << en
        #define smin(a, b) a = min(a, b)
        #define smax(a, b) a = max(a, b)
        #define ssort(a, b) if (a < b) swap(a, b)
        #define bitcnt(a) (__builtin_popcountll(a))
        #define bithigh(a) (63-__builtin_clzll(a))
        #define lg bithigh
        #define highpow(a) (1LL << (ll)lg(a))

        using namespace std;

        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;
        }

        const ll LINF = 4e18;
        const int mxN = 1e7+10, mxM = 5e5, INF = 2e9;
        ll n, m, node[mxN];
        int root2D, N[2], root[mxM], ch[mxN][2], ch2[mxM][2];

        int Node(){ return N[0]++; }

        int Root(){ root[N[1]] = Node(); return N[1]++; }

        int Child(int s, int i){ if (!~s) return -1; if (!~ch[s][i]) ch[s][i] = Node(); return ch[s][i]; }

        int _Child(int s, int i){ if (!~s) return -1; return ch[s][i]; }

        int Child2(int s, int i){ if (!~s) return -1; if (!~ch2[s][i]) ch2[s][i] = Root(); return ch2[s][i]; }

        ll Val(int s){ return (~s ? node[s] : 0); }

        void Print(int s, ll l, ll r){
            if (!~s) return;
            cout << tb << tb << s << sp << l << sp << r << sp << node[s] << en;
            ll m = (l + r)>>1;
            Print(ch[s][0], l, m);
            Print(ch[s][1], m+1, r);
        }
        void Print(int s){ cout << tb << "SEGTREE\n"; Print(s, 0, m-1); cout << en; }

        void Print2D(int s, ll l, ll r){
            if (!~s) return;
            cout << tb << l << sp << r << en;
            Print(root[s]);
            ll m = (l + r)>>1;
            Print2D(ch2[s][0], l, m);
            Print2D(ch2[s][1], m+1, r);
        }
        void Print2D(){ cout << "2D SEGTREE\n"; Print2D(root2D, 0, n-1); cout << en; }

        void update(int s, ll l, ll r, ll pos, ll x){
            if (l == r){ node[s] = x; return; }
            ll m = (l + r)>>1;
            if (pos <= m) update(Child(s, 0), l, m, pos, x);
            else update(Child(s, 1), m+1, r, pos, x);
            node[s] = gcd2(Val(ch[s][0]), Val(ch[s][1]));
        }
        void update(int s, ll pos, ll x){ update(s, 0, m-1, pos, x); }

        ll query(int s, ll l, ll r, ll ql, ll qr){
            if (l > qr || r < ql || !~s) return 0;
            if (l >= ql && r <= qr) return node[s];
            ll m = (l + r)>>1;
            ll a = query(ch[s][0], l, m, ql, qr);
            ll b = query(ch[s][1], m+1, r, ql, qr);
            return gcd2(a, b);
        }
        ll query(int s, ll l, ll r){ return query(s, 0, m-1, l, r); }

        void update2D(int s, ll l, ll r, ll pos, array<ll, 2> args){
            if (l == r){ update(root[s], args[0], args[1]); return; }
            ll m = (l + r)>>1;
            if (pos <= m) update2D(Child2(s, 0), l, m, pos, args);
            else update2D(Child2(s, 1), m+1, r, pos, args);
            ll x = (~ch2[s][0] ? query(root[ch2[s][0]], args[0], args[0]) : 0);
            ll y = (~ch2[s][1] ? query(root[ch2[s][1]], args[0], args[0]) : 0);
            update(root[s], args[0], gcd2(x, y));
        }
        void update2D(ll i, ll j, ll x){ update2D(root2D, 0, n-1, i, {j, x}); }

        ll query2D(int s, ll l, ll r, ll ql, ll qr, array<ll, 2> args){
            if (l > qr || r < ql || !~s) return 0;
            if (l >= ql && r <= qr) return query(root[s], args[0], args[1]);
            ll m = (l + r)>>1;
            ll a = query2D(ch2[s][0], l, m, ql, qr, args);
            ll b = query2D(ch2[s][1], m+1, r, ql, qr, args);
            return gcd2(a, b);
        }
        ll query2D(ll l1, ll r1, ll l2, ll r2){ return query2D(root2D, 0, n-1, l1, r1, {l2, r2}); }

        void init(int R, int C){
            memset(ch, -1, sizeof(ch));
            memset(ch2, -1, sizeof(ch2));
            n = highpow(R);
            if (bitcnt(R) > 1) n <<= 1;
            m = highpow(C);
            if (bitcnt(C) > 1) m <<= 1;
            root2D = Root();
        }

        void update(int P, int Q, long long K) {
            update2D(P, Q, K);
        }

        long long calculate(int P, int Q, int U, int V) {
            return query2D(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...