Cod sursa(job #906004)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 6 martie 2013 13:23:45
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<cstdio>
#include<vector>
#define M 666013
#define NMax (1<<20)+5
using namespace std;

int v[NMax],n;
vector<pair<int,int> > a[M];

vector<pair<int,int> >::iterator find (int x)
{
    vector<pair<int,int> >::iterator it;
    for (it=a[x%M].begin(); it!=a[x%M].end(); ++it)
        if (it->first==x)
            return it;
    return a[x%M].end();
}

void hash ()
{
    int i;
    for (i=1; i<=n; i++)
        if (find(v[i])==a[v[i]%M].end())
            a[v[i]%M].push_back(make_pair(v[i],0));
}

void reset ()
{
    int i;
    vector<pair<int,int> >::iterator it;
    for (i=1; i<=n; i++)
    {
        it=find(v[i]);
        it->second=0;
    }
}

int sol (int x)
{
    int nr=1,st=1,sum=1,i;
    vector<pair<int,int> >::iterator it;
    it=find(v[1]);
    (it->second)=1;
    for (i=2; i<=n; i++)
    {
        it=find(v[i]);
        if ((it->second)==0)
            nr++;
        (it->second)++;
        while (nr>x)
        {
            it=find(v[st]);
            if ((it->second)==1)
                nr--;
            (it->second)--;
            st++;
        }
        sum+=i-st+1;
    }
    return sum;
}

int main ()
{
    int l,u,r1,r2,i;
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    scanf("%d%d%d",&n,&l,&u);
    for (i=1; i<=n; i++)
        scanf("%d",&v[i]);
    hash();
    r1=sol(u);
    reset();
    r2=sol(l-1);
    printf("%d\n",r1-r2);
    return 0;
}