Submission #8687210


Source Code Expand

#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace::std;
typedef long long lint;
#define rep(i, n) for(lint i = 0; i < (lint)(n); i++)
__attribute__((constructor))
void init(){
	cin.tie(0);
	ios::sync_with_stdio(false);
	cout<<fixed<<setprecision(15);
}

class persistent_union_find{
    template<typename T>
    struct persistent_array{
        struct node;
        using np=node*;
        struct node{
            T data;
            np ch[20];
        };
        np root=nullptr;
        persistent_array(){}
        np get_root(){
            return root;
        }
        void destructive_set(int idx,T val,np& t){
            if(!t)t=new node();
            if(idx==0){
                t->data=val;
            }else{
                destructive_set(idx/20,val,t->ch[idx%20]);
            }
        }
        np set(int idx,T val,const np& t){
            np res=new node();
            if(t){
                memcpy(res->ch,t->ch,sizeof(t->ch));
                res->data=t->data;
            }
            if(idx==0){
                res->data=val;
            }else{
                res->ch[idx%20]=set(idx/20,val,res->ch[idx%20]);
            }
            return res;
        }
        T get(int idx,np t){
            if(!t)return 0;
            if(idx==0){
                return t->data;
            }else{
                return get(idx/20,t->ch[idx%20]);
            }
        }
    };
    using lint=long long;
    using PA=persistent_array<lint>;
    PA data;
    public:
    using np=PA::np;
    persistent_union_find(){}
    np init(lint n){
        np res=data.get_root();
        for(lint i=0;i<n;i++)data.destructive_set(i,-1,res);
        return res;
    }
    pair<bool,np> unite(lint x,lint y,np t){
        x=root(x,t);y=root(y,t);
        if(x==y)return {0,t};
        if(data.get(x,t)>data.get(y,t))swap(x,y);
        np res=data.set(y,x,data.set(x,data.get(x,t)+data.get(y,t),t));
        return {1,res};
    }
    lint root(lint x,np t){
        if(data.get(x,t)<0)return x;
        else {
            lint res=root(data.get(x,t),t);
            return res;
        }
    }
    inline bool same(lint x, lint y,np t){return root(x,t)==root(y,t);}
	inline lint size(lint x,np t){return -data.get(root(x,t),t);}
};
using PUF=persistent_union_find;
using np=PUF::np;
 
lint bs(lint ok,lint ng,function<bool(lint)> func) {
    if(ok>ng){ok++;ng--;}
    else {ok--;ng++;}
	while(abs(ok-ng)>1){
		lint mid=(ng+ok)/2;
		if(func(mid))ok=mid;
		else ng=mid;
	}
    return ok;
}
 
int main(){
    lint n,m;
    cin>>n>>m;
    PUF uf;
    vector<np>v(m+1);
    v[0]=uf.init(n);
    rep(i,m){
        lint s,t;
        cin>>s>>t;
        s--;t--;
        v[i+1]=uf.unite(s,t,v[i]).second;
    }
    lint q;
    cin>>q;
    rep(i,q){
        lint s,t;
        cin>>s>>t;
        s--;t--;
        lint ans=bs(m,0,[&](lint x){
            return uf.same(s,t,v[x]);
        });
        if(ans==m+1)cout<<-1<<endl;
        else cout<<ans<<endl;
    }
}

Submission Info

Submission Time
Task H - Union Sets
User hotman78
Language C++14 (GCC 5.4.1)
Score 600
Code Size 3109 Byte
Status AC
Exec Time 1195 ms
Memory 188032 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 3
AC × 49
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt
All sample_01.txt, sample_02.txt, sample_03.txt, subtask_1_1.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_12.txt, subtask_1_13.txt, subtask_1_14.txt, subtask_1_15.txt, subtask_1_16.txt, subtask_1_17.txt, subtask_1_18.txt, subtask_1_19.txt, subtask_1_2.txt, subtask_1_20.txt, subtask_1_21.txt, subtask_1_22.txt, subtask_1_23.txt, subtask_1_24.txt, subtask_1_25.txt, subtask_1_26.txt, subtask_1_27.txt, subtask_1_28.txt, subtask_1_29.txt, subtask_1_3.txt, subtask_1_30.txt, subtask_1_31.txt, subtask_1_32.txt, subtask_1_33.txt, subtask_1_34.txt, subtask_1_35.txt, subtask_1_36.txt, subtask_1_37.txt, subtask_1_38.txt, subtask_1_39.txt, subtask_1_4.txt, subtask_1_40.txt, subtask_1_41.txt, subtask_1_42.txt, subtask_1_43.txt, subtask_1_44.txt, subtask_1_45.txt, subtask_1_46.txt, subtask_1_5.txt, subtask_1_6.txt, subtask_1_7.txt, subtask_1_8.txt, subtask_1_9.txt
Case Name Status Exec Time Memory
sample_01.txt AC 1 ms 256 KiB
sample_02.txt AC 1 ms 256 KiB
sample_03.txt AC 1 ms 256 KiB
subtask_1_1.txt AC 1 ms 256 KiB
subtask_1_10.txt AC 14 ms 768 KiB
subtask_1_11.txt AC 246 ms 4864 KiB
subtask_1_12.txt AC 9 ms 8832 KiB
subtask_1_13.txt AC 3 ms 384 KiB
subtask_1_14.txt AC 2 ms 256 KiB
subtask_1_15.txt AC 78 ms 1280 KiB
subtask_1_16.txt AC 5 ms 384 KiB
subtask_1_17.txt AC 16 ms 256 KiB
subtask_1_18.txt AC 2 ms 256 KiB
subtask_1_19.txt AC 19 ms 20480 KiB
subtask_1_2.txt AC 1 ms 256 KiB
subtask_1_20.txt AC 1 ms 384 KiB
subtask_1_21.txt AC 11 ms 256 KiB
subtask_1_22.txt AC 5 ms 6016 KiB
subtask_1_23.txt AC 209 ms 17792 KiB
subtask_1_24.txt AC 218 ms 18048 KiB
subtask_1_25.txt AC 237 ms 19456 KiB
subtask_1_26.txt AC 289 ms 34816 KiB
subtask_1_27.txt AC 1015 ms 188032 KiB
subtask_1_28.txt AC 953 ms 187904 KiB
subtask_1_29.txt AC 211 ms 17792 KiB
subtask_1_3.txt AC 1 ms 256 KiB
subtask_1_30.txt AC 220 ms 18048 KiB
subtask_1_31.txt AC 234 ms 19456 KiB
subtask_1_32.txt AC 292 ms 34816 KiB
subtask_1_33.txt AC 982 ms 187904 KiB
subtask_1_34.txt AC 967 ms 187904 KiB
subtask_1_35.txt AC 209 ms 17792 KiB
subtask_1_36.txt AC 220 ms 17920 KiB
subtask_1_37.txt AC 233 ms 18816 KiB
subtask_1_38.txt AC 263 ms 28032 KiB
subtask_1_39.txt AC 599 ms 120576 KiB
subtask_1_4.txt AC 26 ms 28160 KiB
subtask_1_40.txt AC 610 ms 120576 KiB
subtask_1_41.txt AC 175 ms 512 KiB
subtask_1_42.txt AC 191 ms 512 KiB
subtask_1_43.txt AC 1004 ms 122496 KiB
subtask_1_44.txt AC 1195 ms 187776 KiB
subtask_1_45.txt AC 176 ms 512 KiB
subtask_1_46.txt AC 200 ms 17792 KiB
subtask_1_5.txt AC 15 ms 640 KiB
subtask_1_6.txt AC 9 ms 9216 KiB
subtask_1_7.txt AC 2 ms 1408 KiB
subtask_1_8.txt AC 3 ms 2560 KiB
subtask_1_9.txt AC 34 ms 2048 KiB