Cod sursa(job #667599)

Utilizator Smaug-Andrei C. Smaug- Data 23 ianuarie 2012 14:35:25
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <utility>
using namespace std;

#define MAXN ((1<<20)+10)
#define MOD 666013

vector< pair<unsigned,int> > H[MOD];
int N, F[MAXN], A[MAXN];

inline void hash_add(unsigned x, int a){
  int key;
 
  key=x%MOD;
  H[key].push_back(make_pair(x, a));

}

inline int hash_find(unsigned x){
  int key;
  vector< pair<unsigned,int> >::iterator ii;

  key=x%MOD;
  for(ii=H[key].begin(); ii!=H[key].end(); ii++)
    if(ii->first == x)
      return ii->second;
  
  return -1;

}

inline long long subsequence_up_to(int v){

  memset(F, 0, sizeof(F));

  int cnt, l, i;
  long long res;

  cnt=0; res=0; l=0;
  for(i=0; i<N; i++){
    if(!F[A[i]])
      cnt++;
    F[A[i]]++;

    while(cnt > v){
      --F[A[l]];
      if(!F[A[l]])
	cnt--;
      l++;
    }

    res+=i-l+1;
  }

  return res;

}

int main(){

  freopen("secv5.in", "r", stdin);
  freopen("secv5.out", "w", stdout);

  int L, R, cnt, i;
  unsigned aux;

  cnt=0;
 
  scanf("%d%d%d", &N, &L, &R);
  for(i=0; i<N; i++){
    scanf("%u", &aux);
    
    if((A[i]=hash_find(aux)) == -1){
      A[i]=++cnt;
      hash_add(aux, cnt);
    }
  }

  printf("%lld\n", subsequence_up_to(R)-subsequence_up_to(L-1));

  return 0;

}