I am getting a SIGSEGV error, i am unable to find where my code might be accessing invalid memory location.
[UPDATE]
Got Accepted, instead of passing comparator for sorting, i passed
greater<vector<int>>().
Can anyone explain why external comparator function gave SIGSEGV and
greater<vector<int>>()
did not?
#include <bits/stdc++.h>
using namespace std;
struct node{
int par;
int count;
int rank;
};
bool comp(vector<int> &a, vector<int> &b){
return a[0] >= b[0];
}
node find(vector<node> &parent, int a){
while(parent[a].par != a){
a = parent[a].par;
}
return parent[a];
}
void unionSet(int a, int b, vector<node> &parent){
node aRoot = find(parent, a);
node bRoot = find(parent, b);
if(aRoot.par == bRoot.par)return;
if(aRoot.rank > bRoot.rank){
swap(aRoot, bRoot);
}
parent[aRoot.par].par = bRoot.par;
parent[bRoot.par].count += aRoot.count;
if(aRoot.rank == bRoot.rank){
parent[bRoot.par].rank += 1;
}
}
void solve(){
int n, m, q;
cin>>n>>m>>q;
vector<node> parent(n);
for(int i=0;i<n;i++){
parent[i].par = i;
parent[i].rank = 0;
parent[i].count = 1;
}
vector<vector<int>> edges(m, vector<int>(3)), queries(q, vector<int>(2));
for(int i=0;i<m;i++){
cin>>edges[i][1]>>edges[i][2]>>edges[i][0]; //w,a,b
}
for(int i=0;i<q;i++){
cin>>queries[i][1]>>queries[i][0]; // w, src, index
queries[i].push_back(i);
}
sort(edges.begin(), edges.end(), comp);
sort(queries.begin(), queries.end(), comp);
// debug2d(edges);
vector<int> res(q);
int j = 0;
for(int i=0;i<q;i++){
while(j < m && edges[j][0] >= queries[i][0]){
unionSet(edges[j][1], edges[j][2], parent);
j++;
}
res[queries[i][2]] = find(parent, queries[i][1]).count;
}
for(int i=0;i<q;i++)cout<<res[i]<<endl;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int t;
t = 1;
while(t--){
solve();
}
return 0;
}