#include "highway.h"
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define vi vector<int>
#define vl vector<long long>
#define ff first
#define ss second
#define pii pair<int,int>
#define pll pair<long long, long long>
#define pb push_back
#define rep(i, b) for(int i = 0; i < (b); ++i)
#define rep2(i,a,b) for(int i = a; i <= (b); ++i)
#define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c)
#define count_bits(x) __builtin_popcountll((x))
#define all(x) (x).begin(),(x).end()
#define siz(x) (int)(x).size()
#define forall(it,x) for(auto& it:(x))
using namespace std;
const int INF = 1e9+50;
const ll INF_L = 1e18+40;
const ll MOD = 1e9+7;
const int maxn = 90001;
vector<pii> graph[maxn];
vector<pii> dij_graph[maxn];
bool odw[maxn];
bool is_take[maxn];
int n;
vi Q;
void bfs(int v, vi& ans)
{
    queue<int> q;
    q.push(v);
    while(!q.empty())
    {
        int t = q.front();
        q.pop();
        ans.pb(t);
        forall(it,graph[t])
        {
            q.push(it.ff);
        }
    }
    reverse(all(ans));
}
void dfs(int v)
{
    stack<int> st;
    st.push(v);
    while(!st.empty())
    {
        int t = st.top();
        st.pop();
        forall(it,graph[t])
        {
            if(is_take[it.ff])
            {
                Q[it.ss] = 1;
                continue;
            }
            st.push(it.ff);
        }    
    }
}
void find_pair(int N, vi U, vi V, int X, int Y) 
{
    ll A = X;
    ll B = Y;
    n = N;
    int m = siz(U);
    vi W(m,1);
    ll dist = ask(W)/B;
    int l = 0;
    int r = m-1;
    int edge = 0;
    while(l <= r)
    {
        int mid = (l+r)/2;
        rep(i,m) W[i] = 0;
        rep2(i,0,mid) W[i] = 1;
        ll new_toll = ask(W);
        if(new_toll != dist*A)
        {
            edge = mid;
            r = mid-1;
        } 
        else
        {
            l = mid+1;
        }
    }
    rep2(i,0,edge)
    {
        W[i] = 0;
        dij_graph[U[i]].pb({V[i],i});
        dij_graph[V[i]].pb({U[i],i});
    }
    rep2(i,edge+1,m-1)
    {
        W[i] = 1;
        dij_graph[U[i]].pb({V[i],i});
        dij_graph[V[i]].pb({U[i],i});
    }
    queue<pii> pq;
    pq.push({U[edge],-1});
    pq.push({V[edge],-1});
    vi trees = {edge};
    while(!pq.empty())
    {
        pii t = pq.front();
        pq.pop();
        if(odw[t.ff]) continue;
        odw[t.ff] = 1;
        if(t.ss != -1) 
        {
            trees.pb(t.ss);
            if(U[t.ss] == t.ff) graph[V[t.ss]].pb({t.ff,t.ss});
            else graph[U[t.ss]].pb({t.ff,t.ss});
        }
        forall(it,dij_graph[t.ff])
        {
            pq.push(it);
        }
    }
    vi tree1;
    vi tree2;
    bfs(V[edge],tree1);
    bfs(U[edge],tree2);
    l = 0;
    r = siz(tree1)-1;
    int a;
    Q.resize(m);
    while(l <= r)
    {
        int mid = (l+r)/2;
        rep(i,m) Q[i] = 1;
        forall(it,trees) Q[it] = 0;
        rep(i,n) is_take[i] = 0;
        rep(i,mid+1) is_take[tree1[i]] = 1;
        dfs(tree1.back());
        if((mid != siz(tree1)-1 ? ask(Q) : -1) != A * dist)
        {
            a = tree1[mid];
            r = mid-1; 
        }
        else
        {
            l = mid+1;
        }
    }
    l = 0;
    r = siz(tree2)-1;
    int b;
    while(l <= r)
    {
        int mid = (l+r)/2;
        rep(i,m) Q[i] = 1;
        forall(it,trees) Q[it] = 0;
        rep(i,n) is_take[i] = 0;
        rep(i,mid+1) is_take[tree2[i]] = 1;
        dfs(tree2.back());
        if((mid != siz(tree2)-1 ? ask(Q) : -1) != A * dist)
        {
            b = tree2[mid];
            r = mid-1; 
        }
        else
        {
            l = mid+1;
        }
    }
    answer(a,b);
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |