183562025-10-21 13:49:36ubormaciAzugandcpp17Accepted 100/100759ms6248 KiB
#include <iostream>
#include <algorithm> // for sort, mainly
#include <vector>
#include <map>
#include <set>
#include <cmath>
#include <array>
#include <string>
#include <cstdio>
#include <iterator>
#include <unordered_set>
#include <cstdint> // for int64_t, int32_t, etc
#include <queue>
#include <stack>
#include <deque>
#include <numeric> // gcd, lcm
#include <fstream>
#include <bitset> // for bitset
#include <iomanip>
#include <cassert> // for set with custom ordering
#include <type_traits> // for set with custom ordering
#include <utility> // for swap, forward, etc
using namespace std;

#pragma GCC optimize("O2")
// #pragma GCC optimize("O1","O2","O3","Ofast","unroll-loops")
//#pragma GCC target("sse","sse2","sse3","sse4.1","sse4.2","avx","avx2","fma")

template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }
template<typename T_container, typename T = typename enable_if<!is_same<T_container, string>::value, typename T_container::value_type>::type> ostream& operator<<(ostream &os, const T_container &v) { os << '{'; string sep; for (const T &x : v) os << sep << x, sep = ", "; return os << '}'; }
void dbg_out() { cout << endl; }
template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T) { cout << ' ' << H; dbg_out(T...); }
#ifdef LOCAL
#define dbg(...) cout << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__)
#else
#define dbg(...)
#endif

/*
 *
 * notes:
 *
 * int64_t
 * stoi(string s) -> string to int
 * to_string() -> int (or else) to string
 *
 * vector declaration:
 * vector<ll> v(n, 0)
 * vector<vector<ll>> v(n, vector<ll>(n, 0));
 *
 * {if statement} ? {truth value} : {false value}
 *
 * set lower bound/upper bound:
 * 	// . . . m1 . . . d . . . . m2
 *    auto m1_it = b.lower_bound(d);
 *    advance(m1_it, -1);
 *    m1 = *m1_it;
 *	m2 = *b.upper_bound(d);
 *
 * #ifdef LOCAL
 *    freopen("in.txt","r",stdin);
 *    freopen("out.txt","w",stdout);
 * #endif
 *
 * constexpr auto lcm(auto x, auto... xs)
 * {
 *	return ((x = std::lcm(x, xs)), ...);
 * }
 *
 * std::gcd(int a, int b)
 *
 * cout << setprecision(n);
 *
 * set with custom ordering
 * set<ll, decltype(&cmp)> qu(cmp);
 *
 */

typedef int64_t ll;

void solve() {

    ll n, q;
    cin >> n >> q;

    ll inf = INT64_MAX;

    vector<ll> v(n, 0);
    vector<vector<ll>> gr(30, vector<ll>(30, inf));
    for(ll i = 0; i < 30; i++) {
        gr[i][i] = 0;
    }

    for(ll i = 0; i < n; i++) {
        vector<ll> temp;
        ll c;
        cin >> c;
        v[i] = c;
        ll counter = 0;
        while(c > 0) {
            ll md = c % 2;
            if(md == 1) {
                temp.push_back(counter);
            }
            counter++;
            c /= 2;
        }

        ll h = temp.size();
        for(ll j = 0; j < h; j++) {
            for(ll k = 0; k < h; k++) {
                if(j == k) {
                    continue;
                }
                
                gr[temp[j]][temp[k]] = 1;
                gr[temp[k]][temp[j]] = 1;

            }
        }
    }

    //cerr << "\nread in, graph init";

    // floyd-warshall
    for(ll k = 0; k < 30; k++) {
        for(ll i = 0; i < 30; i++) {
            for(ll j = 0; j < 30; j++) {
                if(gr[i][k] < inf && gr[k][j] < inf) {
                    gr[i][j] = min(gr[i][j], gr[i][k] + gr[k][j]);
                }
            }
        }
    }

    //cerr << "\nfloyd warshall";

    for(ll qi = 0; qi < q; qi++) {
        //cerr << "\nqi=" << qi;
        ll a, b;
        cin >> a >> b;
        a--;
        b--;

        if(a == b){
            cout << "0\n";
            return;
        }
        
        set<ll> af;
        set<ll> bf;
        ll c = v[a];
        ll counter = 0;
        while(c > 0) {
            ll md = c % 2;
            if(md == 1) {
                af.insert(counter);
            }
            counter++;
            c /= 2;
        }
        counter = 0;
        c = v[b];
        while(c > 0) {
            ll md = c % 2;
            if(md == 1) {
                bf.insert(counter);
            }
            counter++;
            c /= 2;
        }

        ll res = inf;

        for(const auto & ac : af) {
            for(const auto & bc : bf) {
                res = min(gr[ac][bc],res);
                res = min(gr[bc][ac],res);
            }
        }
        
        if(res == inf) {
            cout << "-1\n";
        }else{
            cout << res +1 << "\n";
        }

    }

}

int main()
{
    std::ios_base::sync_with_stdio(false);
    //cin.tie(nullptr);
    //cout.tie(nullptr);

    solve();

    return 0;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted1ms316 KiB
2Accepted1ms316 KiB
subtask27/7
3Accepted3ms316 KiB
4Accepted2ms316 KiB
5Accepted2ms316 KiB
6Accepted3ms316 KiB
7Accepted3ms432 KiB
8Accepted3ms316 KiB
9Accepted2ms316 KiB
10Accepted2ms384 KiB
11Accepted2ms316 KiB
12Accepted3ms316 KiB
13Accepted3ms508 KiB
subtask323/23
14Accepted64ms2896 KiB
15Accepted67ms3148 KiB
16Accepted67ms2884 KiB
17Accepted92ms3240 KiB
18Accepted103ms3124 KiB
19Accepted111ms3124 KiB
20Accepted46ms2640 KiB
21Accepted46ms2868 KiB
22Accepted46ms2636 KiB
23Accepted46ms2808 KiB
24Accepted83ms2868 KiB
25Accepted83ms2868 KiB
subtask421/21
26Accepted458ms5420 KiB
27Accepted460ms5428 KiB
28Accepted470ms5428 KiB
29Accepted469ms5428 KiB
30Accepted490ms5452 KiB
31Accepted486ms5308 KiB
32Accepted456ms5192 KiB
33Accepted462ms5320 KiB
34Accepted446ms5428 KiB
35Accepted448ms5384 KiB
subtask549/49
36Accepted1ms500 KiB
37Accepted1ms316 KiB
38Accepted3ms316 KiB
39Accepted2ms316 KiB
40Accepted2ms316 KiB
41Accepted3ms316 KiB
42Accepted3ms432 KiB
43Accepted3ms316 KiB
44Accepted2ms316 KiB
45Accepted2ms384 KiB
46Accepted2ms316 KiB
47Accepted3ms316 KiB
48Accepted3ms508 KiB
49Accepted64ms2896 KiB
50Accepted67ms3148 KiB
51Accepted67ms2884 KiB
52Accepted92ms3240 KiB
53Accepted103ms3124 KiB
54Accepted111ms3124 KiB
55Accepted46ms2640 KiB
56Accepted46ms2868 KiB
57Accepted46ms2636 KiB
58Accepted46ms2808 KiB
59Accepted83ms2868 KiB
60Accepted83ms2868 KiB
61Accepted458ms5420 KiB
62Accepted460ms5428 KiB
63Accepted470ms5428 KiB
64Accepted469ms5428 KiB
65Accepted490ms5452 KiB
66Accepted486ms5308 KiB
67Accepted456ms5192 KiB
68Accepted462ms5320 KiB
69Accepted446ms5428 KiB
70Accepted448ms5384 KiB
71Accepted507ms5940 KiB
72Accepted537ms5940 KiB
73Accepted535ms5944 KiB
74Accepted759ms6108 KiB
75Accepted695ms6196 KiB
76Accepted754ms5992 KiB
77Accepted740ms6248 KiB
78Accepted451ms5684 KiB
79Accepted455ms5808 KiB
80Accepted467ms5684 KiB
81Accepted456ms5708 KiB
82Accepted662ms5680 KiB
83Accepted702ms5684 KiB
84Accepted700ms6196 KiB