Cod sursa(job #1761150)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 21 septembrie 2016 20:53:15
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <stdio.h>
#define MOD 666013 //:D
using namespace std;

unsigned int h[1048577], next[1048577], liste[MOD], f[1048577], v[1048577], n;

inline int search(int x){
  int j;
  for(j=liste[x%MOD];j!=0 && h[j]!=x;j=next[j]);
  return j;
}

inline long long query(int x){
  int i, j=0, dis=0, poz;
  long long rez=0;
  for(i=0;i<n;i++){
    poz=search(v[i]);
    f[poz]++;
    if(f[poz]==1)
      dis++;
    while(dis>x){
      poz=search(v[j]);
      f[poz]--;
      j++;
      if(f[poz]==0)
        dis--;
    }
    rez+=(i-j+1);
  }
  while(j<n){
    f[search(v[j])]--;
    j++;
  }
  return rez;
}

int main()
{
  int a, i, j, l, u;
  unsigned int x;
  FILE *fi=fopen("secv5.in", "r"), *fo=fopen("secv5.out", "w");
  fscanf(fi, "%u%u%u", &n, &l, &u);
  a=1;
  for(i=0;i<n;i++){
    fscanf(fi, "%u", &x);
    v[i]=x;
    j=search(x);
    if(h[j]!=x){
      h[a]=x;
      next[a]=liste[x%MOD];
      liste[x%MOD]=a;
      a++;
    }
  }
  fprintf(fo, "%lld", 1LL*query(u)-1LL*query(l-1));
  fclose(fi);
  fclose(fo);
  return 0;
}