Submission #376035

#TimeUsernameProblemLanguageResultExecution timeMemory
376035wind_reaperGame (IOI13_game)C++17
37 / 100
13096 ms28908 KiB
#include "game.h"
#include <bits/stdc++.h>

using namespace std;

/*struct SegmentTree{
    struct Node{
        int64_t val;
        Node *lc, *rc;

        Node() : val(0), lc(0), rc(0) {}
    };
    
    vector<Node> tree;

    Node* new_node(){
        tree.emplace_back();
        return &tree.back();
    }

    Node *root;
    int L, R;
    
    void init(int _L, int _R){
        this->L = _L;
        this->R = _R;
        root = new_node();
    }

    void update(int idx, int64_t val, Node* &node, int l, int r){
        if(r - l == 1){
            if(!node) node = new_node();
            node->val = val;
            return;
        }

        int mid = (l + r) >> 1;

        if(idx < mid) update(idx, val, node->lc, l, mid);
        else update(idx, val, node->rc, mid, r);

        node->val = __gcd((node->lc ? node->lc->val : 0), (node->rc ? node->rc->val : 0));
    }

    int64_t query(int l, int r, Node* &node, int lx, int rx){
        if(r <= lx || l >= rx || !node)
            return 0;
        if(l >= lx && r <= rx)
            return node->val;

        int mid = (lx + rx) >> 1;

        return __gcd(query(l, r, node->lc, lx, mid), query(l, r, node->rc, mid, rx));
    }

    void update(int idx, int64_t val){
        update(idx, val, root, L, R);
    }

    int64_t query(int l, int r){
        return query(l, r, root, L, R);
    }
};*/

struct SegmentTree{
    vector<int64_t> st;
    int sz = 1;
    void init(int n){
        while(sz < n)
            sz <<= 1; 
        st.resize(2*sz, 0); 
    }

    void update(int i, int64_t v, int x, int lx, int rx){
        if(rx - lx == 1){
            st[x] = v; 
            return; 
        }

        int mid = (lx + rx) >> 1; 

        if(mid > i)
            update(i, v, 2*x+1, lx, mid); 
        else 
            update(i, v, 2*x+2, mid, rx);

        st[x] = __gcd(st[2*x+1], st[2*x+2]);  
    }

    void update(int i, int64_t v){
        update(i, v, 0, 0, sz); 
    }

    int64_t query(int l, int r, int x, int lx, int rx){
        if(lx >= r || rx <= l)
            return 0; 
        if(lx >= l && rx <= r)
            return st[x]; 

        int mid = (lx + rx) >> 1;

        return __gcd(query(l, r, 2*x+1, lx, mid), query(l, r, 2*x+2, mid, rx)); 
    }

    int64_t query(int l, int r){
        return query(l, r, 0, 0, sz); 
    }
}; 
vector<SegmentTree> T;

void init(int R, int C) {
    T.resize(R);
    for(int i = 0; i < R; i++){
        T[i].init(C);
    }
}

void update(int P, int Q, long long K) {
    T[P].update(Q, K);
}

long long calculate(int P, int Q, int U, int V) {
    int64_t res = 0;
    for(int i = P; i <= U; i++){
        res = __gcd(res, T[i].query(Q, V+1));
    }
    return res;
}
#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...