cheater2k

Stamp Rally - AtCoder Grand Contest 002

Nov 20th, 2017
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.48 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 1e5 + 5;
  5.  
  6. int n, m, q;
  7. int par[N], cnt[N];
  8. vector < pair<int,int> > edges;
  9. int x[N], y[N], z[N], l[N], r[N];
  10.  
  11. int anc(int p) { return p == par[p] ? p : par[p] = anc(par[p]); }
  12. void join(int p, int q) {
  13.     p = anc(p), q = anc(q);
  14.     if (p == q) return;
  15.     par[p] = q;
  16.     cnt[q] += cnt[p]; cnt[p] = 0;
  17. }
  18.  
  19. int main() {
  20.     ios_base::sync_with_stdio(false); cin.tie(0);
  21.     cin >> n >> m;
  22.     for (int i = 0; i < m; ++i) {
  23.         int u, v; cin >> u >> v;
  24.         edges.push_back(make_pair(u, v));
  25.     }
  26.  
  27.     cin >> q;
  28.     for (int i = 1; i <= q; ++i) cin >> x[i] >> y[i] >> z[i], l[i] = 1, r[i] = m;
  29.  
  30.     while(true) {
  31.         vector< pair<int,int> > events;
  32.         for (int i = 1; i <= q; ++i) {
  33.             if (l[i] == r[i]) continue;
  34.             events.push_back(make_pair((l[i] + r[i]) >> 1, i));
  35.         }
  36.         if (events.empty()) break;
  37.         sort(events.begin(), events.end());
  38.  
  39.         // prepare for DSU
  40.         for (int i = 1; i <= n; ++i) par[i] = i, cnt[i] = 1;
  41.  
  42.         // solve
  43.         int ptr = 0;
  44.         for (int id = 1; id <= m; ++id) {
  45.             int u = edges[id - 1].first, v = edges[id - 1].second;
  46.             join(u, v);
  47.  
  48.             while(ptr < (int)events.size() && events[ptr].first <= id) {
  49.                 int idQuery = events[ptr].second;
  50.                 int X = anc(x[idQuery]), Y = anc(y[idQuery]);
  51.  
  52.                 if (cnt[X] + (X == Y ? 0 : cnt[Y]) >= z[idQuery]) r[idQuery] = events[ptr].first;
  53.                 else l[idQuery] = events[ptr].first + 1;
  54.  
  55.                 ++ptr;
  56.             }
  57.  
  58.         }
  59.     }
  60.  
  61.     for (int i = 1; i <= q; ++i) printf("%d\n", l[i]);
  62. }
Advertisement
Add Comment
Please, Sign In to add comment