Pagini recente » Cod sursa (job #2501274) | Borderou de evaluare (job #1189074) | Borderou de evaluare (job #1350862) | Cod sursa (job #2501266) | Cod sursa (job #2501462)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f ("secvmax.in");
ofstream g ("secvmax.out");
long long n, m;
struct Xp{
long long x;
long long poz;
};
long long vek[100008], v[100008], d[100008];
Xp aa[100008];
long long t[100008];
Xp svk[100008];
Xp x[100008];
bool cmp1(Xp y, Xp z)
{
if(y.x >= z.x)
return false;
return true;
}
bool cmp2(Xp y, Xp z)
{
if(y.poz > z.poz)
return false;
return true;
}
long long calc(long long unsigned x)
{
long long y=x, z=x;
while(t[z]!=z) z=t[z];
while(t[x]!=x)
{
x=t[x];
t[y]=z;
y=x;
}
// cout<<" x"<<x<<"."<<z<<"\n";
return z;
}
long long ans=1;
void join(long long x, long long y)
{
if(d[x]<d[y])
{
t[x]=y;
d[y]+=d[x];
ans=max(ans, d[y]);
} else {
t[y]=x;
d[x]+=d[y];
ans=max(ans, d[x]);
}
}
int main()
{
f>>n>>m;
for(long long i=1;i<=n;++i)
{
t[i]=i;
d[i]=1;
}
for(long long i=1;i<=n;++i)
{
f>>vek[i];
svk[i].x=vek[i];
svk[i].poz=i;
}
vek[n+1]= 2000000000;
for(long long i=1;i<=m;++i)
{
f>>x[i].x;
x[i].poz=i;
}
sort(svk+1, svk+n+1, cmp1);
sort(x+1, x+m+1, cmp1);
for(long long i=1;i<=m;++i)
{
aa[i].poz=x[i].poz;
}
long long j=1;
for(long long i=1;i<=m;++i)
{
long long elem =x[i].x;
while(svk[j].x<=elem)
{
v[svk[j].poz]=1;
long long q=svk[j].poz;
if(v[q-1]==1)
{
long long v1=calc(q), v2=calc(q-1);
if(v1!=v2)
join(v1, v2);
}
if(v[q+1]==1)
{
long long v1=calc(q), v2=calc(q+1);
if(v1!=v2)
join(v1, v2);
}
j++;
}
aa[i].x=ans;
}
sort(aa+1, aa+m+1, cmp2);
for(long long i=1;i<=m;++i)
{
g<<aa[i].x<<"\n";
}
return 0;
}