Cod sursa(job #246032)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 19 ianuarie 2009 18:31:38
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <stdio.h>
#include <vector>
#define mod 666013
using namespace std;
struct per{unsigned long n,k;};
long long sec;
unsigned long n,l,u,i,j,x,k,val,L,p,q,ok,dist,a[1024*1024],nr[1024*1024];
vector <per>v[mod];
per aux;

int main(){
  freopen("secv5.in","r",stdin);
  freopen("secv5.out","w",stdout);
  scanf("%lu %lu %lu",&n,&l,&u);
  for (i=1;i<=n;++i){
    scanf("%lu\n",&x);
    k=x%mod;L=v[k].size();ok=0;
    for (j=0;j<L;++j) if (v[k][j].n==x){ok=1;break;}
    if (ok)val=v[k][j].k;
    else {aux.n=x;aux.k=++q;v[k].push_back(aux);val=q;}
    a[i]=val;
  }
  p=1;
  for (i=1;i<=n;++i){
    if (nr[a[i]]==0){nr[a[i]]=1;dist++;}else nr[a[i]]++;
    while (dist>u){nr[a[p]]--;if (nr[a[p]]==0)dist--;p++;}
    sec+=i+1-p;
  }
  p=1;dist=0;l--;memset(nr,0,sizeof(nr));
  for (i=1;i<=n;++i){
    if (nr[a[i]]==0){nr[a[i]]=1;dist++;}else nr[a[i]]++;
    while (dist>l){nr[a[p]]--;if (nr[a[p]]==0)dist--;p++;}
    sec-=i+1-p;
  }
  printf("%lld\n",sec);
return 0;
}