Submission #1188707

#TimeUsernameProblemLanguageResultExecution timeMemory
1188707n3rm1nGame (IOI13_game)C++17
63 / 100
919 ms321536 KiB
#include<iostream>
#include "game.h"
using namespace std;
/// struct
long long n, m;

long long gcd3(long long a, long long b)
{
   // if(!a || !b)return a + b;
  
    if(b > a)swap(a, b);
    while(b)
    {
        long long ost = a % b;
        a = b;
        b = ost;
    }
   
    return a;
}
struct segment_tree_2d
{
    struct segment_tree
    {
        struct node
        {
            long long val;
            node *l;
            node *r;
            node()
            {
                val = 0;
                l = NULL;
                r = NULL;
            }
            node(long long setval)
            {
                val = setval;
                l = NULL;
                r = NULL;
            }
        };
        node *root;
        segment_tree *l;
        segment_tree *r;
        segment_tree()
        {
            root = new node();
            l = NULL;
            r = NULL;
        }
        void merge_nodes(node *tree)
        {
            if(tree -> l == NULL)tree -> l = new node();
            if(tree -> r == NULL)tree -> r = new node();
            tree -> val = gcd3(tree -> l -> val, tree -> r -> val);
        }
        void update(node *tree, long long lt, long long rt, long long updpos, long long updval)
        {
            if(lt == rt)
            {
                tree -> val = updval;
                return;
            }
            long long mid = (lt + rt)/2;
            if(tree -> l == NULL)tree -> l = new node();
            if(tree -> r == NULL)tree -> r = new node();
            if(updpos <= mid)update(tree -> l, lt, mid, updpos, updval);
            else update(tree -> r, mid+1, rt, updpos, updval);
            merge_nodes(tree);
        }
        long long query(node *tree, long long lt, long long rt, long long ql, long long qr)
        {
            if(tree == NULL)return 0;
            if(qr < lt || ql > rt)return 0;
            if(ql <= lt && rt <= qr)
            {
                return tree -> val;
            }
            long long mid = (lt + rt)/2;
            long long onleft = query(tree -> l, lt, mid, ql, qr);
            long long onright = query(tree -> r, mid+1, rt, ql, qr);
            return gcd3(onleft, onright);
        }
        void make_update(long long pos, long long val)
        {
            update(root, 0, m-1, pos, val);
        }
        long long make_query(long long ql, long long qr)
        {
            return query(root, 0, m-1, ql, qr);
        }
    };

    segment_tree *root;
    segment_tree_2d()
    {
        root = new segment_tree();
    }
    void merge0(segment_tree *tree, long long pos)
    {
        if(tree -> l == NULL)tree -> l = new segment_tree();
        if(tree -> r == NULL)tree -> r = new segment_tree();
        long long onleft = tree -> l -> make_query(pos, pos);
        long long onright = tree -> r -> make_query(pos, pos);
        tree -> make_update(pos, gcd3(onleft, onright));
    }

    void update(segment_tree *tree, long long lt, long long rt, long long row, long long col, long long updval)
    {
        if(lt == rt)
        {
            tree -> make_update(col, updval);
            return;
        }
        long long mid = (lt + rt)/2;
        if(row <= mid)
        {
            if(tree -> l == NULL)tree -> l = new segment_tree();
            update(tree -> l, lt, mid, row, col, updval);
        }
        else
        {
            if(tree -> r == NULL)tree -> r = new segment_tree();
            update(tree -> r, mid+1, rt, row, col, updval);
        }
        merge0(tree, col);
    }
    long long query(segment_tree *tree, long long lt, long long rt, long long ql_row, long long qr_row, long long ql_col, long long qr_col)
    {
        if(tree == NULL)return 0;
        if(ql_row > rt || qr_row < lt)return 0;
        if(ql_row <= lt && rt <= qr_row)
        {
            return tree -> make_query(ql_col, qr_col);
        }
        long long mid = (lt + rt)/2;
        long long onleft = query(tree -> l, lt, mid, ql_row, qr_row, ql_col, qr_col);
        long long onright = query(tree -> r, mid+1, rt, ql_row, qr_row, ql_col, qr_col);
        return gcd3(onleft, onright);
    }
    void make_update(long long row, long long col, long long updval)
    {
        update(root, 0, n-1, row, col, updval);
    }
    long long make_query(long long ql_row, long long qr_row, long long ql_col, long long qr_col)
    {
        return query(root, 0, n-1, ql_row, qr_row, ql_col, qr_col);
    }
};
segment_tree_2d s;

void init(int R, int C)
{
    n = R;
    m = C;
}

void update(int P, int Q, long long K)
{

   // cout << r << " " << c << endl;
    s.make_update(P, Q, K);
}

long long calculate(int P, int Q, int U, int V)
{

    long long ans = s.make_query(P, U, Q, V);
    return ans;
}
#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...