Cod sursa(job #2980979)

Utilizator StefantimStefan Timisescu Stefantim Data 17 februarie 2023 00:20:34
Problema Curcubeu Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#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;
}