Cod sursa(job #1779631)

Utilizator danstefanDamian Dan Stefan danstefan Data 15 octombrie 2016 15:05:34
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <bits/stdc++.h>
#define MOD 666013
#define DIM (1<<20)
using namespace std;
unsigned int v[DIM+10],n,l,u,x,in,i,ap[DIM+10],j;
vector<unsigned int>h[MOD+10],hs[MOD+10];
vector<unsigned int>::iterator it;
bool ok;
long long solve(int nr)
{
    int i,j=1,dist=0;
    long long ans=0;
    memset(ap,0,sizeof(ap));
    for(i=1; i<=n; ++i)
    {
        if(ap[v[i]]==0)dist++;
        ap[v[i]]++;
        while(dist>nr)
        {
            ap[v[j]]--;
            if(ap[v[j]]==0)dist--;
            ++j;
        }
        ans+=i-j+1;
    }
    return ans;
}

int main()
{
   /// freopen("secv5.in","r",stdin);
   ifstream f ("secv5.in");
   /// freopen("secv5.out","w",stdout);
   ofstream g ("secv5.out");
    ///scanf("%d%d%d",&n,&l,&u);
    f>>n>>l>>u;
    for(i=1; i<=n; ++i)
    {
    ///    scanf("%d",&v[i]);
       f>>v[i];
        x=v[i];
        ok=false;
        for(it=h[x%MOD].begin(); it<h[x%MOD].end(); ++it)
            if(*it==v[i])
            {
                ok=true;
                break;
            }
        if(!ok)h[x%MOD].push_back(v[i]),hs[x%MOD].push_back(++in);
    }
    for(i=1; i<=n; ++i)
    {
        x=v[i];
        for(j=0; j<h[x%MOD].size(); ++j)
            if(h[x%MOD][j]==v[i])
            {
                v[i]=hs[x%MOD][j];
                break;
            }
    }
    ///printf("%lld\n",solve(u)-solve(l-1));
    g<<solve(u)-solve(l-1)<<'\n';
    return 0;
}