Pagini recente » Cod sursa (job #2893121) | Autentificare | Cod sursa (job #1651631) | Cod sursa (job #423840) | Cod sursa (job #2980979)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("secvmax.in");
ofstream fout("secvmax.out");
const int NMAX = 1000005;
int maxim;
int t[NMAX], g[NMAX], sol[NMAX];
pair <int, int> s[NMAX], l[NMAX], v[NMAX];
bool cmp(pair<int, int> a, pair<int , int> b)
{
if(a.first < b.first)
return 1;
return 0;
}
void definire(int n)
{
for(int i = 1; i <= n; i++)
{
t[i] = i;
g[i] = 1;
}
}
int Find(int nod)
{
while(nod != t[nod])
nod = t[nod];
return nod;
}
void Union(int a, int b)
{
a = Find(a);
b = Find(b);
if(a != b)
{
if(g[a] > g[b])
swap(a,b);
t[a] = t[b];
g[b] += g[a];
maxim = max(maxim, g[b]);
}
}
int main()
{
int n, m, k = 1;
fin >> n >> m;
definire(n);
for(int i = 1; i <= n; i++)
{
fin >> v[i].first;
s[i].first = v[i].first;
s[i].second = i;
}
for(int i = 1; i <= m; i++)
{
fin >> l[i].first;
l[i].second = i;
}
sort(s + 1, s + n + 1, cmp);
sort(l + 1, l + m + 1, cmp);
for(int i = 1; i <= m; i++)
{
while(k <= n && s[k].first <= l[i].first)
{
if(maxim == 0)
maxim = 1;
v[s[k].second].second = 1;
if(v[s[k].second+1].second == 1)
{
Union(s[k].second, s[k].second+1);
}
if(v[s[k].second-1].second == 1)
Union(s[k].second, s[k].second-1);
k++;
}
sol[l[i].second] = maxim;
}
for(int i = 1; i <= m; i++)
fout << sol[i] << "\n";
return 0;
}