Cod sursa(job #1761534)

Utilizator antanaAntonia Boca antana Data 22 septembrie 2016 14:23:13
Problema Secventa 5 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <cstdio>
#include <string.h>
#include <ctype.h>
#define BUF_SIZE 1048576
#define MAXN (1<<20)
#define MOD 1048575
#define uint unsigned int

uint n, r, pos=BUF_SIZE, v[MAXN+1], lista[MOD+1], nxt[MAXN+1], val[MAXN+1], fr[MAXN+1];
char buf[BUF_SIZE];

inline char getChar(FILE *f)
{
    if(pos == BUF_SIZE) pos=0, fread(buf, 1, BUF_SIZE, f);
    return buf[pos++];
}
inline uint getInt(FILE *f)
{
    uint nr=0;
    char c;

    while(!isdigit(c)) c=getChar(f);
    while(isdigit(c)) nr = nr*10 + c - '0', c=getChar(f);

    return nr;
}

inline void adauga(uint x)
{
    int mod = (x&MOD), p;
    p=lista[mod];

    while(p)
    {
        if(val[p] == x)
        {
            fr[p]++;
            return;
        }
        p=nxt[p];
    }

    val[++r]=x;
    fr[r]=1;
    nxt[r]=lista[mod];
    lista[mod]=r;
}

inline void sterge(uint x)
{
    int mod = (x&MOD), p;
    p=lista[mod];

    while(p)
    {
        if(val[p] == x)
        {
            fr[p]--;
            return;
        }
        p=nxt[p];
    }
}

inline int check(uint x)
{
    int mod = (x&MOD), p;
    p=lista[mod];

    while(p)
    {
        if(val[p] == x)
            return fr[p];
        p=nxt[p];
    }
    return 0;
}

inline long long secv(int u)
{
    int i, dif=0, st=1;
    long long ans=0;

    for(i=1;i<=n;++i)
    {
        adauga(v[i]);
        if(check(v[i]) == 1) dif++;
        while(dif > u)
        {
            sterge(v[st]);
            if(!check(v[st])) dif--;
            st++;
        }

        ans+=i-st+1;
    }

    return ans;
}

int main()
{
    FILE *fin, *fout;
    fin = fopen("secv5.in", "r");
    fout = fopen("secv5.out", "w");

    uint i, l, u;
    long long a, b;

    n=getInt(fin);
    l=getInt(fin);
    u=getInt(fin);

    for(i=1;i<=n;++i)
        v[i]=getInt(fin);

    a=secv(u);

    memset(lista, 0, sizeof(lista));
    r=0;

    b=secv(l-1);

    fprintf(fout, "%lld", a-b);
    return 0;
}