Cod sursa(job #1986754)

Utilizator GoogalAbabei Daniel Googal Data 28 mai 2017 21:09:46
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.44 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cassert>

using namespace std;

ifstream in("secvmax.in");
ofstream out("secvmax.out");

const int NMAX = 100000;

struct Data{
  int x;
  int y;
};

int n, m, np = 1, sol, p;
int sef[1 + NMAX], v[1 + NMAX], pos[1 + NMAX], ssz[1 + NMAX];
Data q[1 + NMAX];

bool cmp1(int a, int b){
  return v[a] < v[b];
}

bool cmp2(Data a, Data b){
  return a.x < b.x;
}

bool cmp3(Data a, Data b){
  assert(a.y != b.y);
  return a.y < b.y;
}

int getsef(int el){
  if(el == sef[el])
    return el;
  else{
    sef[el] = getsef(sef[el]);
    return sef[el];
  }
}

int main()
{
  in >> n >> m;
  for(int i = 1; i <= n; i++){
    in >> v[i];
    pos[i] = i;
    sef[i] = i;
    ssz[i] = 1;
  }

  for(int i = 1; i <= m; i++){
    in >> q[i].x;
    q[i].y = i;
  }
  in.close();

  sort(pos + 1, pos + n + 1, cmp1);
  sort(q + 1, q + m + 1, cmp2);

  for(int i = 1; i <= m; i++){
    while(v[pos[np]] <= q[i].x){
      int s = getsef(pos[np]);
      if(s == pos[np]){
        //cout << q[i].x << ' ' << v[pos[np]] << '\n';
        if(sol == 0){
          sol = 1;
        }
        int prv = pos[np] - 1;
        /// reunion with left
        if(prv != 0 && v[prv] <= q[i].x){
          int sp = getsef(prv);
          assert(prv >= 1);
          if(sp == prv){
            ssz[sp]++;
            sef[pos[np]] = sp;
            sol = max(sol, ssz[sp]);
          }
        }
        /*
        cout << i << ": ";
        for(int i = 1; i <= n; i++)
         cout << sef[i] << ' ';
        cout << '\n';
        */
        /// reunion with right
        int nxt = pos[np] + 1;
        if(nxt != n + 1 && v[nxt] <= q[i].x){
          assert(nxt <= n);
          int np1 = getsef(nxt);
          int np2 = getsef(pos[np]);
          if(np1 == nxt){
            if(ssz[np1] <= ssz[np2]){
              sef[np1] = np2;
              ssz[np2] += ssz[np1];
            }else{
              sef[np2] = np1;
              ssz[np1] += ssz[np2];
            }
            sol = max(sol, ssz[getsef(np2)]);
          }
        }
        /*
        cout << i << ": ";
        for(int i = 1; i <= n; i++)
          cout << sef[i] << ' ';
        cout << '\n';
        */
      }
      np++;
    }
    q[i].x = sol;
  }

  sort(q + 1, q + m + 1, cmp3);

  for(int i = 1; i <= m; i++)
    out << q[i].x << '\n';
  out.close();
  return 0;
}