Cod sursa(job #2834045)

Utilizator andreiiorgulescuandrei iorgulescu andreiiorgulescu Data 16 ianuarie 2022 12:38:12
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <bits/stdc++.h>

using namespace std;

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

long long n,l,u,a[1100000],ans;
vector<pair<int,long long>>g[100005];
int aft[1100000];
bool blocl[1100000],blocu[1100000];

int main()
{
    in >> n >> l >> u;
    for (int i = 1; i <= n; i++)
    {
        in >> a[i];
        g[a[i] % 100000].push_back(make_pair(a[i],i));
    }
    for (int i = 0; i < 100000; i++)
    {
        for (int j = 0; j < g[i].size(); j++)
        {
            int q;
            for (q = j - 1; q >= 0; q--)
                if (g[i][j].first == g[i][q].first)
                    break;
            if (q != -1)
                aft[g[i][q].second] = g[i][j].second;
        }
    }
    for (int i = 0; i < 100000; i++)
        g[i].clear();
    int dl = 1,du = 1,eleml = 1,elemu = 1;
    blocl[0] = blocu[0] = true;
    blocl[aft[1]] = blocu[aft[1]] = true;
    for (int i = 0; i <= n; i++)
        if (aft[i] == 0)
            aft[i] = n + 1;
    for (int st = 1; st <= n; st++)
    {
        blocl[aft[st - 1]] = false;
        blocu[aft[st - 1]] = false;
        if (aft[st - 1] <= dl)
            eleml++;
        if (aft[st - 1] <= du)
            elemu++;
        if (blocl[st - 1] == false)
            eleml--;
        if (blocu[st - 1] == false)
            elemu--;
        while (dl < n and eleml < l)
        {
            dl++;
            blocl[aft[dl]] = true;
            if (blocl[dl] == false)
                eleml++;
        }
        while (du <= n and elemu <= u)
        {
            du++;
            if (du > n)
                break;
            else
            {
                blocu[aft[du]] = true;
                if (blocu[du] == false)
                    elemu++;
            }
        }
        if (eleml != l)
            break;
        else
        {
            ans += du - dl;
            cout << dl << " " << du << '\n';
        }
    }
    out << ans;
    return 0;
}