Cod sursa(job #1313638)

Utilizator gapdanPopescu George gapdan Data 10 ianuarie 2015 22:09:48
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<cstdio>
#include<vector>
#define MOD 666013
#define NMAX 1<<20+2
using namespace std;
int n,l,u;
unsigned int v[NMAX];
vector<unsigned int>H[MOD+1];
bool cauta(int x)
{
    int i;
    int r=x%MOD;
    for(i=0;i<H[r].size();++i)
        if (H[r][i]==x) return 1;
    return 0;
}
void add(int x)
{
    int r=x%MOD;
    H[r].push_back(x);
}
int sterge(int x)
{
    int r=x%MOD;
    int ok=0,i;
    int k=0;
    vector<unsigned int>::iterator it;
    it=H[r].begin();
    while (it!=H[r].end())
    {
        if (*it==x && ok==0)
        {
            ok=1;
            H[r].erase(it);
        }
        else
        {
            if (*it==x) return 1;
            ++it;
        }
    }
    return 0;
}
long long sol(unsigned int x)
{
    int i,j,nr=0;
    long long rez=0;
    for (i=1;i<MOD;++i)
    H[i].clear();
    for (i=1,j=1;i<=n;++i)
    {
        if (cauta(v[i])==0) ++nr;
        add(v[i]);
        while(nr>x)
        {
            int cat=sterge(v[j]);
            if (cat==0) --nr;
            ++j;
        }
        rez+=(i-j+1);
    }
    return rez;
}
int main()
{
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    scanf("%d%d%d",&n,&l,&u);
    for (int i=1;i<=n;++i)
        scanf("%u",&v[i]);
        sol(l-1);
    printf("%lld\n",sol(u)-sol(l-1));
    return 0;
}