Cod sursa(job #1033252)

Utilizator cat_red20Vasile Ioana cat_red20 Data 16 noiembrie 2013 17:15:22
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<fstream>
#include<vector>
#define MOD 666013
#define MAXN 1<<20
using namespace std;
unsigned int f1[MAXN+1],f2[MAXN+1],n,l,u,v[MAXN+1],p,q,nr1,nr2,dist,sol;
vector< pair<int,int> > h[MOD+1];
ifstream fin("secv5.in");
ofstream fout("secv5.out");

unsigned int cauta(int x)
{
    unsigned int r=x%MOD;
    for(unsigned int i=0;i<h[r].size();i++)
    {
        if(h[r][i].first==x)
        return h[r][i].second;
    }
    dist++;
    h[r].push_back(make_pair(x,dist));
    return dist;
}

void citire()
{
    unsigned int x;
    fin>>n>>l>>u;
    p=q=1;
    for(unsigned int i=1;i<=n;i++)
    {
        fin>>x;
        v[i]=cauta(x);
        f1[v[i]]++;
        f2[v[i]]++;
        if(f1[v[i]]==1)
            nr1++;
        if(f2[v[i]]==1)
            nr2++;

        if(nr1>l)
        {
            f1[v[p]]=0;
            p++;
            nr1--;
        }
        if(nr1==l)
        {
            while(f1[v[p]]>1)
            {
                f1[v[p]]--;
                p++;
            }
        }
        if(nr2>u)
        {

            while(v[q]==v[q+1] && q<n)
            {
                f2[v[q]]--;
                q++;
            }
            f2[v[q]]--;
            q++;
            nr2--;
        }
        if(nr1==l)
        {
            sol+=p-q+1;
        }
    }
    fout<<sol;
}

int main()
{
    citire();

    return 0;
}