Cod sursa(job #2469799)

Utilizator mirceatlxhaha haha mirceatlx Data 8 octombrie 2019 00:01:02
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <bits/stdc++.h>
#define mod 666666
using namespace std;
ifstream fin ("secv5.in");
ofstream fout ("secv5.out");
 
unsigned int n, l, u, v[1050000];
struct element
{
    unsigned int x, ap;
};
vector <element> h[mod];
 
int aparitii(unsigned int v, int c)
{
    vector <element> :: iterator i;
    for(i=h[c].begin();i!=h[c].end() && i->x!=v; ++i);
    if(i==h[c].end())
        return 0;
    return i->ap;
}
void adauga(unsigned int v, int c)
{
    vector <element> :: iterator i;
    for(i=h[c].begin();i!=h[c].end() && i->x!=v; ++i);
    if(i==h[c].end())
        {
            h[c].push_back({v, 1});
            return;
        }
    i->ap++;
}
void sterge(unsigned int v, int c)
{
    vector <element> :: iterator i;
    for(i=h[c].begin();i!=h[c].end() && i->x!=v; ++i);
    i->ap--;
    if(i->ap==0)
        h[c].erase(i);
}
long long raspuns(int u)
{
    int i, j, dif, ok;
    long long secv;
    i=1; j=1; dif=0; secv=0;
    while(j<=n)
    {
        adauga(v[j], v[j]%mod);
        ok=aparitii(v[j], v[j]%mod);
        if(ok==1)
        {
            dif++;
            while(dif>u)
            {
                if(aparitii(v[i], v[i]%mod)==1)
                    dif--;
                sterge(v[i], v[i]%mod);
                i++;
            }
        }
        secv+=j-i+1;
        j++;
    }
    while(i<=n)
    {
        sterge(v[i], v[i]%mod);
        i++;
    }
    return secv;
}
int main()
{
    fin >> n >> l >> u;
    for(int i=1;i<=n;i++)
        fin >> v[i];
    if(l==1)
    fout << raspuns(u);
    else fout << raspuns(u)-raspuns(l-1);
    return 0;
}