Cod sursa(job #12634)

Utilizator filipbFilip Cristian Buruiana filipb Data 4 februarie 2007 15:35:47
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#define MOD 666013
#define NMax 1048580

using namespace std;

int N, L, U;
unsigned int v[NMax], h = 1;
int uz[NMax];
long long Res = 0;

vector< pair<unsigned int, int> > H[MOD];

long long check(int X)
{
     int i, lst, nrd;
     long long R = 0;
     
     if (X == 0) return 0;
     
     memset(uz, 0, sizeof(uz));
     for (i = 1, lst = 1, nrd = 0; i <= N; i++)
     {
         if (!uz[v[i]]) nrd++;
         uz[v[i]]++;
          
         while (lst < i && nrd > X)
         {
            uz[v[lst]]--;
            if (!uz[v[lst]]) nrd--;
            lst++;
         }

         R += (i-lst+1);    

     }
     
     return R;
}

int cheie(unsigned int X)
{
    int r = X % MOD;
    vector< pair<unsigned int, int> >::iterator it;
    
    for (it = H[r].begin(); it != H[r].end(); it++)
        if (it->first == X)
           return it->second;
    return -1;
}

int main(void)
{
    int i, j, l;
    char buf[64];
    
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);
    
    scanf("%d %d %d\n", &N, &L, &U);
    for (i = 1; i <= N; i++)
    {
        fgets(buf, sizeof(buf), stdin);
        l = strlen(buf);
        
        for (j = 0; j < l; j++)
            if (buf[j] >= '0' && buf[j] <= '9')
               v[i] = v[i] * 10 + (buf[j] - '0');
            else break;
        
    }
       
   
    for (i = 1, l = 0; i <= N; i++)
    {
        j = cheie(v[i]);
        if (j == -1)
        { l++; H[v[i] % MOD].push_back(make_pair(v[i], l)); v[i] = l; }
        else v[i] = j;
    }
        
    printf("%lld\n", check(U) - check(L-1));
    
    return 0;
}