Advertisement
Guest User

Untitled

a guest
Feb 18th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.21 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 100005;
  4. int dis[MAXN], in[MAXN], n, k, sz[MAXN];
  5. multiset<int> G;
  6.  
  7. void init(){
  8.     for(int i = 1; i <= n; i++){
  9.         dis[i] = i;
  10.         sz[i] = 1;
  11.     }
  12. }
  13.  
  14. int fa(int id){
  15.     return (dis[id] == id) ? (id): (dis[id] = fa(dis[id]));
  16. }
  17.  
  18. void Un(int a, int b){
  19.     int sa, sb;
  20.     a = fa(a); b = fa(b);
  21.     sa = sz[a]; sb = sz[b];
  22.     if(a == b) return;
  23.     dis[a] = b;
  24.     sz[b] = sa + sb;
  25.     G.erase(G.find(sa));
  26.     G.erase(G.find(sb));
  27.     G.insert(sz[b]);
  28. }
  29.  
  30. int main(){
  31.     ios::sync_with_stdio(0),cin.tie(0);
  32.     int flag;
  33.     while(cin >> n >> k){
  34.         G.clear(); init();
  35.         for(int i = 1; i <= n; i++) cin >> in[i];
  36.         in[0] = 0; flag = -1;
  37.         for(int i = 1; i <= n; i++){
  38.             if(in[i] && flag == -1){
  39.                 for(flag = i; flag <= n;){
  40.                     dis[fa(flag)] = fa(i);
  41.                     if(in[flag+1]) flag++;
  42.                     else break;
  43.                 }
  44.                 G.insert(flag- i + 1);
  45.                 sz[fa(i)] = flag - i + 1;
  46.                 i = flag; flag = -1;
  47.             }
  48.         }
  49.         while(k--){
  50.             cin >> flag;
  51.             G.insert(1);
  52.             in[flag] = 1;
  53.             if(in[flag-1]) Un(flag-1,flag);
  54.             if(in[flag+1]) Un(flag+1,flag);
  55.             cout << *(G.begin()) << ' ' << *(G.rbegin()) << '\n';
  56.         }
  57.     }
  58.     return 0;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement