Submission #782148

#TimeUsernameProblemLanguageResultExecution timeMemory
782148FatihSolak게임 (IOI13_game)C++17
100 / 100
2247 ms155392 KiB
#include "game.h"
#include <bits/stdc++.h>
#define N 4000005
using namespace std;
int R,C;

struct node1{
    long long val;
    int l,r;
    int lc,rc;
    node1():lc(0),rc(0),val(0){

    }
}t1[N];
int cnt1 = 1;
struct SegTree{
    int root;
    SegTree():root(0){

    }
    void upd(int v,int pos,long long val){
        if(t1[v].l == t1[v].r){
            t1[v].val = val;
            return;
        }
        if(t1[v].lc != 0 && t1[t1[v].lc].l <= pos && pos <= t1[t1[v].lc].r){
            upd(t1[v].lc,pos,val);
            t1[v].val = __gcd(t1[t1[v].lc].val,t1[t1[v].rc].val);
            return;
        }
        if(t1[v].rc != 0 && t1[t1[v].rc].l <= pos && pos <= t1[t1[v].rc].r){
            upd(t1[v].rc,pos,val);
            t1[v].val = __gcd(t1[t1[v].lc].val,t1[t1[v].rc].val);
            return;
        }
        int tm = (t1[v].l + t1[v].r)/2;
        if(t1[v].lc == 0 && pos <= tm){
            t1[v].lc = cnt1++;
            t1[t1[v].lc].val = val;
            t1[t1[v].lc].l = pos;
            t1[t1[v].lc].r = pos; 
            t1[v].val = __gcd(t1[t1[v].lc].val,t1[t1[v].rc].val);
            return;
        }
        if(t1[v].rc == 0 && pos > tm){
            t1[v].rc = cnt1++;
            t1[t1[v].rc].val = val;
            t1[t1[v].rc].l = pos;
            t1[t1[v].rc].r = pos; 
            t1[v].val = __gcd(t1[t1[v].lc].val,t1[t1[v].rc].val);
            return;
        }
        if(pos <= tm){
            int tmp = t1[v].lc;
            t1[v].lc = cnt1++;
            t1[t1[v].lc].l = t1[v].l;
            t1[t1[v].lc].r = tm;
            while(1){
                int tmm = (t1[t1[v].lc].l + t1[t1[v].lc].r)/2;
                if(t1[tmp].r <= tmm && pos <= tmm){
                    t1[t1[v].lc].r = tmm;
                    continue;
                }
                if(t1[tmp].l > tmm && pos > tmm){
                    t1[t1[v].lc].l = tmm + 1;
                    continue;
                }
                break;
            }
            if(pos < t1[tmp].l){
                t1[t1[v].lc].lc = cnt1++;
                t1[t1[v].lc].rc = tmp;
                t1[t1[t1[v].lc].lc].val = val;
                t1[t1[t1[v].lc].lc].l = pos;
                t1[t1[t1[v].lc].lc].r = pos; 
            }
            else{
                t1[t1[v].lc].lc = tmp;   
                t1[t1[v].lc].rc = cnt1++;
                t1[t1[t1[v].lc].rc].val = val;
                t1[t1[t1[v].lc].rc].l = pos;
                t1[t1[t1[v].lc].rc].r = pos; 
            }
            t1[t1[v].lc].val = __gcd(t1[t1[t1[v].lc].lc].val,t1[t1[t1[v].lc].rc].val);
        }
        else{
            int tmp = t1[v].rc;
            t1[v].rc = cnt1++;
            t1[t1[v].rc].l = tm+1;
            t1[t1[v].rc].r = t1[v].r;
            while(1){
                int tmm = (t1[t1[v].rc].l + t1[t1[v].rc].r)/2;
                if(t1[tmp].r <= tmm && pos <= tmm){
                    t1[t1[v].rc].r = tmm;
                    continue;
                }
                if(t1[tmp].l > tmm && pos > tmm){
                    t1[t1[v].rc].l = tmm + 1;
                    continue;
                }
                break;
            }
            if(pos < t1[tmp].l){
                t1[t1[v].rc].lc = cnt1++;
                t1[t1[v].rc].rc = tmp;
                t1[t1[t1[v].rc].lc].val = val;
                t1[t1[t1[v].rc].lc].l = pos;
                t1[t1[t1[v].rc].lc].r = pos; 
            }
            else{
                t1[t1[v].rc].lc = tmp;   
                t1[t1[v].rc].rc = cnt1++;
                t1[t1[t1[v].rc].rc].val = val;
                t1[t1[t1[v].rc].rc].l = pos;
                t1[t1[t1[v].rc].rc].r = pos; 
            }
            t1[t1[v].rc].val = __gcd(t1[t1[t1[v].rc].lc].val,t1[t1[t1[v].rc].rc].val);
        }
        t1[v].val = __gcd(t1[t1[v].lc].val,t1[t1[v].rc].val);
    }
    long long get(int v,int l,int r){
        // cout << v << ' ' << l << ' ' << r << endl;
        // cout << t1[v].l << ' ' << t1[v].r << ' ' <<  t1[v].val << endl;
        if(v == 0 || t1[v].r < l || r < t1[v].l)
            return 0;
        if(l <= t1[v].l && t1[v].r <= r){
            return t1[v].val;
        }
        return __gcd(get(t1[v].lc,l,r),get(t1[v].rc,l,r));
    }
    void upd(int pos,long long val){
        if(root == 0){
            root = cnt1++;
            t1[root].l = 0;
            t1[root].r = C-1;
        }
        upd(root,pos,val);
    }
    long long get(int l,int r){
        //cout << "HEY" << endl;
        return get(root,l,r);
    }
};

struct Node2{
    int lc,rc;
    SegTree t;
    Node2():lc(0),rc(0){

    }
}t2[N];
int cnt2 = 1;
map<int,SegTree> mp;
struct SegTree2D{
    int root;
    SegTree2D():root(0){}

    void upd(int v,int tl,int tr,int pos1,int pos2){
        t2[v].t.upd(pos2,mp[pos2].get(tl,tr));
        if(tl == tr){
            return;
        }
        int tm = (tl + tr)/2;
        if(pos1 <= tm){
            if(t2[v].lc == 0)
                t2[v].lc = cnt2++;
            upd(t2[v].lc,tl,tm,pos1,pos2);
        }
        else{
            if(t2[v].rc == 0)
                t2[v].rc = cnt2++;
            upd(t2[v].rc,tm+1,tr,pos1,pos2);
        }
    }
    long long get(int v,int tl,int tr,int l1,int r1,int l2,int r2){
        //cout << v << ' ' << tl << ' ' << tr << endl;
        if(v == 0 || tr < l1 || r1 < tl){
            return 0;
        }
        if(l1 <= tl && tr <= r1){
            return t2[v].t.get(l2,r2);
        }
        int tm = (tl + tr)/2;
        return __gcd(get(t2[v].lc,tl,tm,l1,r1,l2,r2),get(t2[v].rc,tm+1,tr,l1,r1,l2,r2));
    }
    void upd(int pos1,int pos2){
        if(root == 0){
            root = cnt2++;
        }
        upd(root,0,R-1,pos1,pos2);
    }
    long long get(int l1,int r1,int l2,int r2){
        return get(root, 0, R-1, l1, r1, l2, r2);
    }
}tree;

void init(int r, int c) {
    R = 1e9;
    C = 1e9;
}
void update(int P, int Q, long long K) {
    mp[Q].upd(P,K);
    tree.upd(P,Q);
}

long long calculate(int P, int Q, int U, int V) {
    return tree.get(P,U,Q,V);
}

Compilation message (stderr)

game.cpp: In constructor 'node1::node1()':
game.cpp:10:12: warning: 'node1::rc' will be initialized after [-Wreorder]
   10 |     int lc,rc;
      |            ^~
game.cpp:8:15: warning:   'long long int node1::val' [-Wreorder]
    8 |     long long val;
      |               ^~~
game.cpp:11:5: warning:   when initialized here [-Wreorder]
   11 |     node1():lc(0),rc(0),val(0){
      |     ^~~~~
#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...