Cod sursa(job #12625)

Utilizator filipbFilip Cristian Buruiana filipb Data 4 februarie 2007 15:19:49
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#define NMax 1048580

using namespace std;

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

int BS(unsigned int X)
{
    int l, r, m;
    
    l = 1; r = h;
    while (l <= r)
    {
          m = (l + r) / 2;
          if (X > a[m]) l = m+1;
          else if (X < a[m]) r = m-1;
          else return m;     
    }
    
    return -1; 
}

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 main(void)
{
    int i, j, l;
    char buf[64];
    
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);
    
    scanf("%d %d %d", &N, &L, &U);
    for (i = 1; i <= N; i++)
    {
        scanf("%s", &buf);
        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; i <= N; i++) a[i] = v[i];
    sort(a+1, a+N+1);
    
    for (i = 2; i <= N; i++)
        if (a[i] != a[h])
           a[++h] = a[i];
    for (i = h + 1; i <= N; i++) a[i] = 0;
   
    for (i = 1; i <= N; i++)
        v[i] = BS(v[i]);
        
    printf("%lld\n", check(U) - check(L-1));
    
    return 0;
}