Cod sursa(job #1142515)

Utilizator lianaliana tucar liana Data 13 martie 2014 21:44:59
Problema Secventa 5 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<stdio.h>
#include<vector>
using namespace std;
#define modulo 666013
#define nmax (1<<20)+5
struct element{unsigned int x, poz;};
int n, l, u, i, ult, r, poz, nrel, nrd, rez;
unsigned int v[nmax], nr[nmax], x;
vector <element> h[modulo+5];
vector <element> ::iterator it;
element el;

void citire()
{
    scanf("%ld %ld %ld",&n,&l,&u);
    for (i=1;i<=n;i++)
    {
        scanf("%lld",&x);
        r=x%modulo; poz=0;
        for (it=h[r].begin();it!=h[r].end();it++)
            if ((*it).x==x)
            {   poz=(*it).poz;  break;  }
        if (poz==0)
        {
            nrel++; poz=nrel;
            el.x=x; el.poz=nrel;
            h[r].push_back(el);
        }
        v[i]=poz;
    }
}

int calculare(int x)
{
    ult=nrd=rez=0;
    for (i=1;i<=n;i++)
    {
        while(1)
        {
            ult++;
            nr[v[ult]]++;
            nrd+=(nr[v[ult]]==1);
            if ((nrd>x)||(ult==n+1))
                break;
        }
        nr[v[ult]]--;   nrd-=(nr[v[ult]]==0);
        ult--;
        rez+=ult-i+1;
        nr[v[i]]--;     nrd-=(nr[v[i]]==0);
    }
    return rez;
}

int main()
{
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    citire();
    printf("%ld",calculare(u)-calculare(l-1));
    return 0;
}