Cod sursa(job #2730682)

Utilizator Sebastian27Marcu Sebastian Sebastian27 Data 26 martie 2021 17:56:17
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb

#include <stdio.h>
#include <stdlib.h>
#define M 666019
#define N (1 << 20)

unsigned int v[N], val[N+1], nrap[N+1], urm[N+1], lst[M], nr, n;

unsigned int exista(unsigned int x)
{
    unsigned int c = x % M;
    unsigned int p = lst[c];
    while (p != 0)
    {
        if (x == val[p])
        {
            return p;
        }
        p = urm[p];
    }
    return 0;
}

unsigned int adauga(unsigned int x)
{
    unsigned int p = exista(x);
    if (p != 0)
    {
        nrap[p]++;
        return p;
    }
    unsigned int c = x % M;
    val[++nr] = x;
    nrap[nr] = 1;
    urm[nr] = lst[c];
    lst[c] = nr;
    return nr;
}

unsigned int sterge(unsigned int x)
{
    unsigned int p = exista(x);
    nrap[p]--;
    return p;
}

long long nrsecv(unsigned int d)
{
    unsigned int i, j = 0, p, nrd = 0;
    long long rez = 0;
    for (i = 1; i <= n; i++)
    {
        nrap[i] = 0;
    }
    for (i = 0; i < M; i++)
    {
        lst[i] = 0;
    }
    nr = 0;
    for (i = 0; i < n; i++)
    {
        p = adauga(v[i]);
        if (nrap[p] == 1)
        {
            nrd++;
        }
        while (j <= i && nrd > d)
        {
            p = sterge(v[j++]);
            if (nrap[p] == 0)
            {
                nrd--;
            }
        }
        rez += i - j + 1;
    }
    return rez;
}

int main()
{
    FILE *in, *out;
    unsigned int l, u, i;
    in = fopen("secv5.in", "r");
    out = fopen("secv5.out", "w");
    fscanf(in, "%u%u%u", &n, &l, &u);
    for (i = 0; i < n; i++)
    {
        fscanf(in, "%u", &v[i]);
    }
    fclose(in);
    fprintf(out, "%lld", nrsecv(u) - nrsecv(l-1));
    fclose(out);
    return 0;
}