Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- const int MAXN = 100005;
- int dis[MAXN], in[MAXN], n, k, sz[MAXN];
- multiset<int> G;
- void init(){
- for(int i = 1; i <= n; i++){
- dis[i] = i;
- sz[i] = 1;
- }
- }
- int fa(int id){
- return (dis[id] == id) ? (id): (dis[id] = fa(dis[id]));
- }
- void Un(int a, int b){
- int sa, sb;
- a = fa(a); b = fa(b);
- sa = sz[a]; sb = sz[b];
- if(a == b) return;
- dis[a] = b;
- sz[b] = sa + sb;
- G.erase(G.find(sa));
- G.erase(G.find(sb));
- G.insert(sz[b]);
- }
- int main(){
- ios::sync_with_stdio(0),cin.tie(0);
- int flag;
- while(cin >> n >> k){
- G.clear(); init();
- for(int i = 1; i <= n; i++) cin >> in[i];
- in[0] = 0; flag = -1;
- for(int i = 1; i <= n; i++){
- if(in[i] && flag == -1){
- for(flag = i; flag <= n;){
- dis[fa(flag)] = fa(i);
- if(in[flag+1]) flag++;
- else break;
- }
- G.insert(flag- i + 1);
- sz[fa(i)] = flag - i + 1;
- i = flag; flag = -1;
- }
- }
- while(k--){
- cin >> flag;
- G.insert(1);
- in[flag] = 1;
- if(in[flag-1]) Un(flag-1,flag);
- if(in[flag+1]) Un(flag+1,flag);
- cout << *(G.begin()) << ' ' << *(G.rbegin()) << '\n';
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement