func_code_string: #include <bits/stdc++.h>   using namespace std;   int n;   vector<int> g[100005];   vector<pair<pair<int, int>, int> > coord;   int visited[100005];   long long ans = 1;   const long long pmod = 1000000007;   long long expsize;   set<int> x, y;   bool cycle;   int mapback[100005];   long long qpmod(long long b, long long e) {     long long cur = b;     long long res = 1;     while (e) {       if (e % 2 == 1) {         res = res * cur % pmod;       }       e /= 2;       cur = cur * cur % pmod;     }     return res;   }   pair<pair<int, int>, int> m3(int a, int b, int c) {     pair<pair<int, int>, int> res;     res.first.first = a;     res.first.second = b;     res.second = c;     return res;   }   bool cmpx(pair<pair<int, int>, int> x, pair<pair<int, int>, int> y) {     if (x.first.first < y.first.first) return true;     if ((x.first.first == y.first.first) && (x.first.second < y.first.second))       return true;     return false;   }   bool cmpy(pair<pair<int, int>, int> x, pair<pair<int, int>, int> y) {     if (x.first.second < y.first.second) return true;     if ((x.first.second == y.first.second) && (x.first.first < y.first.first))       return true;     return false;   }   void dfs(int last, int cur) {     expsize++;     visited[cur] = 1;     x.insert(coord[mapback[cur]].first.first);     y.insert(coord[mapback[cur]].first.second);     int i;     for (i = 0; i < g[cur].size(); i++) {       if (g[cur][i] == last) continue;       if (visited[g[cur][i]]) {         cycle = true;         continue;       }       dfs(cur, g[cur][i]);     }   }   int main() {     scanf( %d , &n);     int i, j, k;     for (i = 0; i < n; i++) {       scanf( %d %d , &j, &k);       coord.push_back(m3(j, k, i));     }     sort(coord.begin(), coord.end(), cmpx);     for (i = 1; i < n; i++) {       if (coord[i].first.first == coord[i - 1].first.first) {         g[coord[i].second].push_back(coord[i - 1].second);         g[coord[i - 1].second].push_back(coord[i].second);       }     }     sort(coord.begin(), coord.end(), cmpy);     for (i = 1; i < n; i++) {       if (coord[i].first.second == coord[i - 1].first.second) {         g[coord[i].second].push_back(coord[i - 1].second);         g[coord[i - 1].second].push_back(coord[i].second);       }     }     for (i = 0; i < n; i++) {       mapback[coord[i].second] = i;     }     for (i = 0; i < n; i++) {       if (visited[i] == 0) {         x.clear();         y.clear();         cycle = false;         dfs(i, i);         expsize = x.size() + y.size();         if (cycle) {           ans = ans * qpmod(2, expsize) % pmod;         } else {           ans = ans * ((qpmod(2, expsize) + pmod - 1) % pmod) % pmod;         }       }     }     printf( %d n , (int)ans);     return 0;   }   