Cod sursa(job #1764982)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 26 septembrie 2016 10:09:39
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda cerculdeinfo-lectia1-hashuri.rabinkarp Marime 1.3 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define INF 2140000000
#define MaxN 1048581
#define MOD 666013
using namespace std;
 
int N,L,U,X,pos=0,v[MaxN];
unsigned S[MaxN];
vector <pair<unsigned,int>> h[MOD];
inline void Add_To_Hash(unsigned nr)
{
    for(int i=0;i<h[nr%MOD].size();i++)
        if(h[nr%MOD][i].first==nr)
            return;
    h[nr%MOD].push_back(make_pair(nr,0));
}
inline int Search(unsigned nr)
{
    for(int i=0;i<h[nr%MOD].size();i++)
        if(h[nr%MOD][i].first==nr)return h[nr%MOD][i].second;
}
inline long long seq(int Len)
{
    if(Len==0)return 0;
    long long ans=0;
    int d=0,j=1;
    memset(v,0,sizeof v);
    for(int i=1;i<=N;i++)
    {
        if(++v[S[i]]==1)d++;
        while(d>Len)
            if(--v[S[j++]]==0)
                d--;
        ans+=i-j+1;
    }
    return ans;
}
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",&S[i]);
        Add_To_Hash(S[i]);
    }
    for(int i=0;i<MOD;i++)
        for(int j=0;j<h[i].size();j++)
            h[i][j].second=++pos;
    for(int i=1;i<=N;i++)
        S[i]=Search(S[i]);
    printf("%lld\n",seq(U)-seq(L-1));
    return 0;
}