Pagini recente » Cod sursa (job #582215) | Cod sursa (job #2141360) | Cod sursa (job #2947859) | Cod sursa (job #1588659) | Cod sursa (job #1986754)
#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;
}