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 |
|
|
| 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 |