Submission #659262

#TimeUsernameProblemLanguageResultExecution timeMemory
659262Danilo21Game (IOI13_game)C++17
80 / 100
3674 ms256000 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 = 2e7+10, INF = 2e9;
ll n, m, node[mxN];
int root2D, N, ch[mxN][2];

int Node(){ return N++; }

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

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

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

int _Child(int s, int i){ if (!~s) return -1; return ch[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, n-1); cout << en; }

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

void update2D(int s, ll l, ll r, ll pos, array<ll, 2> args){
    if (l == r){ update(node[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 = (~ch[s][0] ? query(node[ch[s][0]], args[0], args[0]) : 0);
    ll y = (~ch[s][1] ? query(node[ch[s][1]], args[0], args[0]) : 0);
    update(node[s], args[0], gcd2(x, y));
}
void update2D(ll i, ll j, ll x){ update2D(root2D, 0, m-1, j, {i, 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(node[s], args[0], args[1]);
    ll m = (l + r)>>1;
    ll a = query2D(ch[s][0], l, m, ql, qr, args);
    ll b = query2D(ch[s][1], m+1, r, ql, qr, args);
    return gcd2(a, b);
}
ll query2D(ll i1, ll j1, ll i2, ll j2){ return query2D(root2D, 0, m-1, j1, j2, {i1, i2}); }

void init(int R, int C){
    memset(ch, -1, sizeof(ch));
    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, Q, U, 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...