183562025-10-21 13:49:36ubormaciAzugandcpp17Elfogadva 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;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva1ms316 KiB
2Elfogadva1ms316 KiB
subtask27/7
3Elfogadva3ms316 KiB
4Elfogadva2ms316 KiB
5Elfogadva2ms316 KiB
6Elfogadva3ms316 KiB
7Elfogadva3ms432 KiB
8Elfogadva3ms316 KiB
9Elfogadva2ms316 KiB
10Elfogadva2ms384 KiB
11Elfogadva2ms316 KiB
12Elfogadva3ms316 KiB
13Elfogadva3ms508 KiB
subtask323/23
14Elfogadva64ms2896 KiB
15Elfogadva67ms3148 KiB
16Elfogadva67ms2884 KiB
17Elfogadva92ms3240 KiB
18Elfogadva103ms3124 KiB
19Elfogadva111ms3124 KiB
20Elfogadva46ms2640 KiB
21Elfogadva46ms2868 KiB
22Elfogadva46ms2636 KiB
23Elfogadva46ms2808 KiB
24Elfogadva83ms2868 KiB
25Elfogadva83ms2868 KiB
subtask421/21
26Elfogadva458ms5420 KiB
27Elfogadva460ms5428 KiB
28Elfogadva470ms5428 KiB
29Elfogadva469ms5428 KiB
30Elfogadva490ms5452 KiB
31Elfogadva486ms5308 KiB
32Elfogadva456ms5192 KiB
33Elfogadva462ms5320 KiB
34Elfogadva446ms5428 KiB
35Elfogadva448ms5384 KiB
subtask549/49
36Elfogadva1ms500 KiB
37Elfogadva1ms316 KiB
38Elfogadva3ms316 KiB
39Elfogadva2ms316 KiB
40Elfogadva2ms316 KiB
41Elfogadva3ms316 KiB
42Elfogadva3ms432 KiB
43Elfogadva3ms316 KiB
44Elfogadva2ms316 KiB
45Elfogadva2ms384 KiB
46Elfogadva2ms316 KiB
47Elfogadva3ms316 KiB
48Elfogadva3ms508 KiB
49Elfogadva64ms2896 KiB
50Elfogadva67ms3148 KiB
51Elfogadva67ms2884 KiB
52Elfogadva92ms3240 KiB
53Elfogadva103ms3124 KiB
54Elfogadva111ms3124 KiB
55Elfogadva46ms2640 KiB
56Elfogadva46ms2868 KiB
57Elfogadva46ms2636 KiB
58Elfogadva46ms2808 KiB
59Elfogadva83ms2868 KiB
60Elfogadva83ms2868 KiB
61Elfogadva458ms5420 KiB
62Elfogadva460ms5428 KiB
63Elfogadva470ms5428 KiB
64Elfogadva469ms5428 KiB
65Elfogadva490ms5452 KiB
66Elfogadva486ms5308 KiB
67Elfogadva456ms5192 KiB
68Elfogadva462ms5320 KiB
69Elfogadva446ms5428 KiB
70Elfogadva448ms5384 KiB
71Elfogadva507ms5940 KiB
72Elfogadva537ms5940 KiB
73Elfogadva535ms5944 KiB
74Elfogadva759ms6108 KiB
75Elfogadva695ms6196 KiB
76Elfogadva754ms5992 KiB
77Elfogadva740ms6248 KiB
78Elfogadva451ms5684 KiB
79Elfogadva455ms5808 KiB
80Elfogadva467ms5684 KiB
81Elfogadva456ms5708 KiB
82Elfogadva662ms5680 KiB
83Elfogadva702ms5684 KiB
84Elfogadva700ms6196 KiB