Submission #1126627

#TimeUsernameProblemLanguageResultExecution timeMemory
1126627brintonGame (IOI13_game)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
// #define MAX_COORD (long long)(1e9)
#define MAX_COORD (long long)(7)
// 1D(only j)
struct Node1D{
    Node1D* lc;
    Node1D* rc;
    int val;
    Node1D(){
        lc = nullptr;
        rc = nullptr;
        val = 0;
    }
};
void pull1D(Node1D* curr){
    int l = (curr->lc == nullptr)?0:curr->lc->val;
    int r = (curr->rc == nullptr)?0:curr->rc->val;
    curr->val = gcd(l,r);
}
void modify1D(Node1D* curr,int l,int r,int tar,int nv){
    if(l == r){
        curr->val = nv;
        return;
    }
    int m = (l+r)/2;
    if(tar <= m){
        // update left
        if(curr->lc == nullptr) curr->lc = new Node1D();
        modify1D(curr->lc,l,m,tar,nv);
    }else{
        // update right
        if(curr->rc == nullptr) curr->rc = new Node1D();
        modify1D(curr->rc,m+1,r,tar,nv);
    }
    pull1D(curr);
}
int query1D(Node1D* curr,int l,int r,int L,int R){
    // cout << l << " " << r << " " << L << " " << R << endl;
    if(curr == nullptr)return 0;
    if(l == L && r == R){
        // cout << "query get: " << curr->val << endl;
        return curr->val;
    }
    int m = (l+r)/2;
    if(R <= m){
        return query1D(curr->lc,l,m,L,R);
    }else if(L >= m+1){
        return query1D(curr->rc,m+1,r,L,R);
    }else{
        return gcd(query1D(curr->lc,l,m,L,m),
                   query1D(curr->rc,m+1,r,m+1,R));
    }
}
// 2D
struct Node{
    Node* lc;
    Node* rc;
    Node1D* val;
    Node(){
        lc = nullptr;
        rc = nullptr;
        val = new Node1D();
    }
};
void pull(Node1D* curr,Node1D* LN,Node1D* RN,int l,int r,int tarJ){
    // cout << "pull rangeJ from " << l << " to " << r << endl; 
    assert(LN != nullptr || RN != nullptr);
    if(LN != nullptr){

    }
    if(l == r){
        int lV = (LN == nullptr)?0:LN->val;
        int rV = (RN == nullptr)?0:RN->val;
        // cout << "update val:" << lV << " " << rV << ":" << gcd(lV,rV) << endl;
        curr->val = gcd(lV,rV);
        return;
    }
    int m = (l+r)/2;
    if(tarJ <= m){
        if(curr->lc == nullptr)curr->lc = new Node1D();
        pull(curr->lc,(LN == nullptr)?nullptr:LN->lc,(RN == nullptr)?nullptr:RN->lc,l,m,tarJ);
    }else{
        if(curr->rc == nullptr)curr->rc = new Node1D();
        pull(curr->rc,(LN == nullptr)?nullptr:LN->rc,(RN == nullptr)?nullptr:RN->rc,m+1,r,tarJ);
    }
    pull1D(curr);
}
void modify(Node* curr,int li,int ri,int tarI,int tarJ,int nv){
    // cout << "modify I in range from " << li << " to " << ri << endl;
    if(li == ri){
        assert(li == tarI);
        modify1D(curr->val,0,MAX_COORD,tarJ,nv);
        return;
    }
    int m = (li+ri)/2;
    if(tarI <= m){
        if(curr->lc == nullptr)curr->lc = new Node();
        modify(curr->lc,li,m,tarI,tarJ,nv);
    }else{
        if(curr->rc == nullptr)curr->rc = new Node();
        modify(curr->rc,m+1,ri,tarI,tarJ,nv);
    }
    // cout << "pull rangeI(" << li << "," << ri << ")" << endl; 
    pull(curr->val,(curr->lc == nullptr)?nullptr:curr->lc->val,(curr->rc == nullptr)?nullptr:curr->rc->val,0,MAX_COORD,tarJ);
}
int query(Node* curr,int l,int r,int li,int ri,int lj,int rj){
    if(curr == nullptr)return 0;
    if(l == li && r == ri){
        // cout << "query In " << li << "," << ri << endl;
        return query1D(curr->val,0,MAX_COORD,lj,rj);
    }
    int m = (l+r)/2;
    if(ri <= m){
        return query(curr->lc,l,m,li,ri,lj,rj);
    }else if(li >= m+1){
        return query(curr->rc,m+1,r,li,ri,lj,rj);
    }else{
        return gcd(query(curr->lc,l,m,li,m,lj,rj),
            query(curr->rc,m+1,r,m,ri,lj,rj));
    }
}
signed main(){
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    //start here
    int R,C,Q;
    cin >> R >> C >> Q;
    // cout << gcd(0,0) << endl;
    Node* head = new Node();
    while(Q--){
        int type;cin >> type;
        if(type == 1){
            // update i,j to k;
            int i,j,k;
            cin >> i >> j >> k;
            modify(head,0,MAX_COORD,i,j,k);
            // cout << query(head,0,MAX_COORD,i,3,j,3) << " debug of:" << i << "," << j<< "," << k << endl;
        }else{
            // query the gcd between
            int li,lj,ri,rj;
            cin >> li >> lj >> ri >> rj;
            cout << query(head,0,MAX_COORD,li,ri,lj,rj) << '\n';
        }
    }
}

Compilation message (stderr)

/usr/bin/ld: /tmp/ccuPLOHH.o: in function `main':
grader.c:(.text.startup+0x0): multiple definition of `main'; /tmp/cc1Q5JEw.o:game.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/ccuPLOHH.o: in function `main':
grader.c:(.text.startup+0x6a): undefined reference to `init'
/usr/bin/ld: grader.c:(.text.startup+0xcc): undefined reference to `calculate'
/usr/bin/ld: grader.c:(.text.startup+0x136): undefined reference to `update'
collect2: error: ld returned 1 exit status