//Coded by Vishal Mourya
//If you use this code anywhere you need to mention my name as above
#include<bits/stdc++.h>
#define ll long long int
#define vec vector<ll>
#define pb push_back
#define f(a,b) for( ll i = a ; i < b ; i++ )
#define fe(a,b) for( ll i = a ; i <= b ; i++ )
#define fj(a,b) for( ll j = a ; j < b ; j++ )
#define fk(a,b) for( ll k = a ; k < b ; k++ )
#define fasthoja ios_base::sync_with_stdio(false); cin.tie(NULL);
#define maxN 100001
#define mod 1000000007
#define inf 1000000007
using namespace std;
vector< pair<ll,ll> > adj[maxN];
vector<ll> dist(maxN,inf);
ll dp[1001][1001]; //This will store shortest diatance of every other node
ll storeMax[maxN]; //This array will store maximum element from each row
void djAlgo( ll n , ll src , ll times ) { // no. of nodes , source node , what timee it is called
//declaring min heap
priority_queue< pair<ll,ll> , vector< pair<ll,ll> >, greater< pair<ll,ll> > > pq;
ll max = 0; //will give maximum from each row
pq.push( {0,src} ); // { dist of source node, source node}
dist[src] = 0;
while( !pq.empty() ) {
ll curr = pq.top().second;
ll curr_d = pq.top().first;
pq.pop();
for( auto edge : adj[curr] ) {
if( curr_d + edge.second < dist[edge.first] ) {
dist[edge.first] = curr_d +edge.second;
pq.push( {dist[edge.first], edge.first} );
}
}//end of for loop
}//end of while loop
fe(1,n){
dp[times][i] = dist[i]; //filling out dp array
if( dist[i] > max ){
max = dist[i];
storeMax[times] = max;
}
dist[i] = inf;
} //end of for loop
}
void printDp( ll n ) {
fe(1,n){
fj(1,n+1) cout << dp[i][j] << " ";
cout << "\n";
}
}
void init1() {
//This function will initialize everything used globally like array,adj list,etc
f(0,maxN) {
adj[i].clear(); //clearing previous inputs
dist[i] = inf;
storeMax[i] = 0;
}//end of for loop
f(0,1001){
fj(0,1001) dp[i][j] = 0;
}
}
ll countSetBits( ll num ) {
return __builtin_popcount(num); // __builtin_popcount(4) return number of set bits in number
}
void finalDp( ll n ) {
fe(1,n){
fj(1,n+1) {
ll setBit1 = countSetBits( dp[i][j] );
ll setBit2 = countSetBits( storeMax[i] );
dp[i][j] = ( setBit1 ^ setBit2 );
}//end of inner for loop
}//end of outer for loop
}
void init2( ll n ) {
//This function will fill our dp array voila !!
fe(1,n){
//Start wil 1
djAlgo( n , i , i );
}//end of for loop
finalDp(n); //for doing xor operations
} //end of init2 function
int main(void){
fasthoja;
ll t; cin>>t;
while(t--){
init1();
ll n,m; cin >> n >> m;
while(m--) {
ll a,b,w;
cin >> a >> b;
//as mentioned distance is abs( b*b - a*a )
w = abs( (b*b) - (a*a) );
adj[a].pb( {b,w} );
adj[b].pb( {a,w} );
}
init2(n);
ll q; cin >> q;
while(q--) { // query loop
ll l,r; cin >> l >> r; //query range
cout << dp[l][r] << "\n";
}//end of query loop
cout << "\n";
} //end of test case loop
return 0;
}//end of main function
Ly9Db2RlZCBieSBWaXNoYWwgTW91cnlhCi8vSWYgeW91IHVzZSB0aGlzIGNvZGUgYW55d2hlcmUgeW91IG5lZWQgdG8gbWVudGlvbiBteSBuYW1lIGFzIGFib3ZlIAoKI2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBsbCBsb25nIGxvbmcgaW50IAojZGVmaW5lIHZlYyB2ZWN0b3I8bGw+CiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgZihhLGIpIGZvciggbGwgaSA9IGEgOyBpIDwgYiA7IGkrKyApCiNkZWZpbmUgZmUoYSxiKSBmb3IoIGxsIGkgPSBhIDsgaSA8PSBiIDsgaSsrICkKI2RlZmluZSBmaihhLGIpIGZvciggbGwgaiA9IGEgOyBqIDwgYiA7IGorKyApCiNkZWZpbmUgZmsoYSxiKSBmb3IoIGxsIGsgPSBhIDsgayA8IGIgOyBrKysgKQojZGVmaW5lIGZhc3Rob2phIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyBjaW4udGllKE5VTEwpOwojZGVmaW5lIG1heE4gMTAwMDAxCiNkZWZpbmUgbW9kIDEwMDAwMDAwMDcKI2RlZmluZSBpbmYgMTAwMDAwMDAwNwp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdmVjdG9yPCBwYWlyPGxsLGxsPiA+IGFkalttYXhOXTsKdmVjdG9yPGxsPiBkaXN0KG1heE4saW5mKTsKbGwgZHBbMTAwMV1bMTAwMV07IC8vVGhpcyB3aWxsIHN0b3JlIHNob3J0ZXN0IGRpYXRhbmNlIG9mIGV2ZXJ5IG90aGVyIG5vZGUKbGwgc3RvcmVNYXhbbWF4Tl07IC8vVGhpcyBhcnJheSB3aWxsIHN0b3JlIG1heGltdW0gZWxlbWVudCBmcm9tIGVhY2ggcm93ICAKCnZvaWQgZGpBbGdvKCBsbCBuICwgbGwgc3JjICwgbGwgdGltZXMgKSB7IC8vIG5vLiBvZiBub2RlcyAsIHNvdXJjZSBub2RlICwgd2hhdCB0aW1lZSBpdCBpcyBjYWxsZWQKICAgIAogICAgLy9kZWNsYXJpbmcgbWluIGhlYXAKICAgIHByaW9yaXR5X3F1ZXVlPCBwYWlyPGxsLGxsPiAsIHZlY3RvcjwgcGFpcjxsbCxsbD4gPiwgZ3JlYXRlcjwgcGFpcjxsbCxsbD4gPiA+IHBxOwogICAgbGwgbWF4ID0gMDsgLy93aWxsIGdpdmUgbWF4aW11bSBmcm9tIGVhY2ggcm93IAogICAgCiAgICBwcS5wdXNoKCB7MCxzcmN9ICk7ICAvLyB7IGRpc3Qgb2Ygc291cmNlIG5vZGUsIHNvdXJjZSBub2RlfQogICAgCiAgICBkaXN0W3NyY10gPSAwOwogICAgCiAgICB3aGlsZSggIXBxLmVtcHR5KCkgKSB7CiAgICAJCiAgICAgICAgbGwgY3VyciA9IHBxLnRvcCgpLnNlY29uZDsKICAgICAgICBsbCBjdXJyX2QgPSBwcS50b3AoKS5maXJzdDsKICAgICAgICBwcS5wb3AoKTsKICAgICAgICAKICAgICAgICBmb3IoIGF1dG8gZWRnZSA6IGFkaltjdXJyXSApIHsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKCBjdXJyX2QgKyBlZGdlLnNlY29uZCA8IGRpc3RbZWRnZS5maXJzdF0gKSB7CiAgICAgICAgICAgICAgICBkaXN0W2VkZ2UuZmlyc3RdID0gY3Vycl9kICtlZGdlLnNlY29uZDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgcHEucHVzaCgge2Rpc3RbZWRnZS5maXJzdF0sIGVkZ2UuZmlyc3R9ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9Ly9lbmQgb2YgZm9yIGxvb3AKICAgICAgICAKICAgIH0vL2VuZCBvZiB3aGlsZSBsb29wCiAgICAKICAgIGZlKDEsbil7CiAgICAgIAogICAgICBkcFt0aW1lc11baV0gPSBkaXN0W2ldOyAvL2ZpbGxpbmcgb3V0IGRwIGFycmF5IAogICAgICAKICAgICAgaWYoIGRpc3RbaV0gPiBtYXggKXsKICAgICAgICBtYXggPSBkaXN0W2ldOwogICAgICAgIHN0b3JlTWF4W3RpbWVzXSA9IG1heDsKICAgICAgfSAKICAgICAgCiAgICAgIGRpc3RbaV0gPSBpbmY7CiAgICB9IC8vZW5kIG9mIGZvciBsb29wCiAgICAKfQoKdm9pZCBwcmludERwKCBsbCBuICkgewogICAgZmUoMSxuKXsKICAgICAgICBmaigxLG4rMSkgY291dCA8PCBkcFtpXVtqXSA8PCAiICI7CiAgICAgICAgY291dCA8PCAiXG4iOwogICAgfQp9Cgp2b2lkIGluaXQxKCkgewogICAgCiAgICAvL1RoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIGV2ZXJ5dGhpbmcgdXNlZCBnbG9iYWxseSBsaWtlIGFycmF5LGFkaiBsaXN0LGV0YyAKICAgIGYoMCxtYXhOKSB7CiAgICAJCiAgICAgICAgYWRqW2ldLmNsZWFyKCk7IC8vY2xlYXJpbmcgcHJldmlvdXMgaW5wdXRzCiAgICAgICAgZGlzdFtpXSA9IGluZjsKICAgICAgICBzdG9yZU1heFtpXSA9IDA7CiAgICB9Ly9lbmQgb2YgZm9yIGxvb3AKICAgIAogICAgZigwLDEwMDEpewogICAgICAgIGZqKDAsMTAwMSkgZHBbaV1bal0gPSAwOwogICAgfQp9CgpsbCBjb3VudFNldEJpdHMoIGxsIG51bSApIHsKICAgIAogICAgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudChudW0pOyAgLy8gICBfX2J1aWx0aW5fcG9wY291bnQoNCkgcmV0dXJuIG51bWJlciBvZiBzZXQgYml0cyBpbiBudW1iZXIKfQoKdm9pZCBmaW5hbERwKCBsbCBuICkgewogICAgCiAgICBmZSgxLG4pewogICAgICAgIGZqKDEsbisxKSB7CiAgICAgICAgICAgIAogICAgICAgICAgICBsbCBzZXRCaXQxID0gY291bnRTZXRCaXRzKCBkcFtpXVtqXSApOwogICAgICAgICAgICBsbCBzZXRCaXQyID0gY291bnRTZXRCaXRzKCBzdG9yZU1heFtpXSApOwogICAgICAgICAgICAKICAgICAgICAgICAgZHBbaV1bal0gPSAoIHNldEJpdDEgXiBzZXRCaXQyICk7CiAKICAgICAgICB9Ly9lbmQgb2YgaW5uZXIgZm9yIGxvb3AKICAgICAgICAKICAgICAgICAKICAgIH0vL2VuZCBvZiBvdXRlciBmb3IgbG9vcAp9Cgp2b2lkIGluaXQyKCBsbCBuICkgewogICAgCiAgICAvL1RoaXMgZnVuY3Rpb24gd2lsbCBmaWxsIG91ciBkcCBhcnJheSB2b2lsYSAhIQogICAgZmUoMSxuKXsKICAgICAgICAvL1N0YXJ0IHdpbCAxIAogICAgICAgIGRqQWxnbyggbiAsIGkgLCBpICk7CiAgICB9Ly9lbmQgb2YgZm9yIGxvb3AgCiAgICAKICAgIGZpbmFsRHAobik7IC8vZm9yIGRvaW5nIHhvciBvcGVyYXRpb25zIAogICAgCn0gLy9lbmQgb2YgaW5pdDIgZnVuY3Rpb24gCgppbnQgbWFpbih2b2lkKXsKICAgIAogICAgZmFzdGhvamE7CiAgICBsbCB0OyBjaW4+PnQ7CiAgICB3aGlsZSh0LS0pewogICAgICAgIAogICAgICAgIGluaXQxKCk7CiAgICAgICAgbGwgbixtOyBjaW4gPj4gbiA+PiBtOwogICAgICAgIHdoaWxlKG0tLSkgewogICAgICAgICAgICAKICAgICAgICAgICAgbGwgYSxiLHc7CiAgICAgICAgICAgIGNpbiA+PiBhID4+IGI7CiAgICAgICAgICAgIC8vYXMgbWVudGlvbmVkIGRpc3RhbmNlIGlzIGFicyggYipiIC0gYSphICkKICAgICAgICAgICAgdyA9IGFicyggKGIqYikgLSAoYSphKSApOwogICAgICAgICAgICBhZGpbYV0ucGIoIHtiLHd9ICk7CiAgICAgICAgICAgIGFkaltiXS5wYigge2Esd30gKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaW5pdDIobik7CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgbGwgcTsgY2luID4+IHE7CiAgICAgICAgd2hpbGUocS0tKSB7IC8vIHF1ZXJ5IGxvb3AKICAgICAgICAKICAgICAgICAgICAgbGwgbCxyOyBjaW4gPj4gbCA+PiByOyAvL3F1ZXJ5IHJhbmdlCiAgICAgICAgICAgIGNvdXQgPDwgZHBbbF1bcl0gPDwgIlxuIjsKICAgICAgICAgICAgCiAgICAgICAgfS8vZW5kIG9mIHF1ZXJ5IGxvb3AKICAgICAgICAKICAgICAgICBjb3V0IDw8ICJcbiI7CiAgICAgICAgCiAgICB9IC8vZW5kIG9mIHRlc3QgY2FzZSBsb29wIAogICAgcmV0dXJuIDA7Cn0vL2VuZCBvZiBtYWluIGZ1bmN0aW9u