Submission #581715

#TimeUsernameProblemLanguageResultExecution timeMemory
581715ggohGame (IOI13_game)C++14
10 / 100
1278 ms17960 KiB
#include "game.h"
#include <bits/stdc++.h>
using namespace std;
int R, C, N, ch, P, Q, U, V;
int px, qx, py, qy;
int xco, yco;
long long v;
long long K;
struct Y
{
    Y *left, *right;
    int only;
    long long val;
    Y(int d, long long va) : left(NULL), right(NULL), only(d), val(va) {}
};
struct X
{
    X *left, *right;
    Y *ynode;
    X() : left(NULL), right(NULL), ynode(NULL) {}
} * inix;

long long gcd2(long long xx, long long yy)
{
    if (yy == 0)
        return xx;
    return gcd2(yy, xx % yy);
}

void yup(Y *y, int s, int e)
{
    int m = (s + e) >> 1;
    if (y->only >= 0)
    {
        if (y->only == yco)
        {
            y->val = v;
            if (!y->left && !y->right)
                return;
        }
        else
        {
            if (y->only <= m && !y->left)
            {
                y->left = new Y(y->only, y->val);
            }
            else if (y->only > m && !y->right)
            {
                y->right = new Y(y->only, y->val);
            }
            y->only = -1;
        }
    }
    if (m >= yco)
    {
        if (!y->left)
        {
            y->left = new Y(yco, v);
        }
        yup(y->left, s, m);
    }
    else
    {
        if (!y->right)
        {
            y->right = new Y(yco, v);
        }
        yup(y->right, m + 1, e);
    }
    long long l = 0, r = 0;
    if (y->left)
        l = y->left->val;
    if (y->right)
        r = y->right->val;
    y->val = gcd2(l, r);
}
void hardyup(Y *y, int s, int e, Y *ly, Y *ry)
{
    int m = (s + e) >> 1;
    long long l = 0, r = 0;
    int cnt = 0, valind = -1;
    if (ly)
    {
        l = ly->val;
        if (ly->only >= 0)
        {
            cnt++;
            valind = ly->only;
            if (ly->only <= m && !ly->left)
            {
                ly->left = new Y(ly->only, ly->val);
            }
            else if (ly->only > m && !ly->right)
            {
                ly->right = new Y(ly->only, ly->val);
            }
        }
        else
            cnt += 2;
    }
    if (ry)
    {
        r = ry->val;
        if (ry->only >= 0)
        {
            cnt++;
            valind = ry->only;
            if (ry->only <= m && !ry->left)
            {
                ry->left = new Y(ry->only, ry->val);
            }
            else if (ry->only > m && !ry->right)
            {
                ry->right = new Y(ry->only, ry->val);
            }
        }
        else
            cnt += 2;
    }
    if (cnt == 1)
    {
        y->only = valind;
        y->val = gcd2(l, r);
        return;
    }
    else
    {
        if (y->only >= 0)
        {
            if (y->only <= m && !y->left)
            {
                y->left = new Y(y->only, y->val);
            }
            else if (y->only > m && !y->right)
            {
                y->right = new Y(y->only, y->val);
            }
        }
        y->only = -1;
        y->val = gcd2(l, r);
    }

    if (s == e)
        return;
    if (yco <= m)
    {
        if (!y->left)
        {
            y->left = new Y(yco, v);
        }
        hardyup(y->left, s, m, ly ? ly->left : NULL, ry ? ry->left : NULL);
    }
    else
    {
        if (!y->right)
        {
            y->right = new Y(yco, v);
        }
        hardyup(y->right, m + 1, e, ly ? ly->right : NULL, ry ? ry->right : NULL);
    }
}
void xup(X *x, int s, int e)
{
    int m = (s + e) >> 1;
    if (!x->ynode)
        x->ynode = new Y(yco, v);
    if (s == e)
    {
        yup(x->ynode, 0, C - 1);
        return;
    }
    if (m >= xco)
    {
        if (!x->left)
        {
            x->left = new X();
        }
        xup(x->left, s, m);
    }
    else
    {
        if (!x->right)
        {
            x->right = new X();
        }
        xup(x->right, m + 1, e);
    }
    hardyup(x->ynode, 0, C - 1, x->left ? x->left->ynode : NULL, x->right ? x->right->ynode : NULL);
}
long long yans(Y *y, int s, int e)
{
    int m = (s + e) >> 1;
    if ((!y) || s > qy || e < py)
        return 0ll;

    if (py <= s && e <= qy)
    {
        return y->val;
    }
    if (y->only >= 0)
    {
        if (py <= y->only && y->only <= qy)
        {
            return y->val;
        }
        else
            return 0ll;
    }
    long long l = 0, r = 0;
    if (y->left)
    {
        l = yans(y->left, s, m);
    }
    if (y->right)
    {
        r = yans(y->right, m + 1, e);
    }
    return gcd2(l, r);
}
long long xans(X *x, int s, int e)
{
    int m = (s + e) >> 1;
    if ((!x->ynode) || s > qx || e < px)
        return 0ll;
    if (px <= s && e <= qx)
    {
        return yans(x->ynode, 0, C - 1);
    }
    long long l = 0, r = 0;
    if (x->left)
        l = xans(x->left, s, m);
    if (x->right)
        r = xans(x->right, m + 1, e);
    return gcd2(l, r);
}
void init(int RR, int CC)
{
    R = RR;
    C = CC;
    inix = new X();
}
void update(int P, int Q, long long K)
{
    xco = P;
    yco = Q;
    v = K;
    xup(inix, 0, R - 1);
}
long long calculate(int P, int Q, int U, int V)
{
    px = P;
    qx = U;
    py = Q;
    qy = V;
    return xans(inix, 0, R - 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...