Cod sursa(job #10664)

Utilizator ZeusCatalin Tiseanu Zeus Data 28 ianuarie 2007 22:53:20
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb

using namespace std;

#include <cstdio>
#include <map>
#include <iostream>

int N, L, U, A[1<<20+2];
map<int,int> mp;

void resort()
{
          
}

long long doit( int LEN )
{
     long long ret = 0;
     
     int r = 0, dist = 0;
     
     bool can;
     
     mp.clear();
     
//     cout << " here " << endl;
     
     for( int i = 1; i <= N; i++ )
     {
         while( r + 1 <= N  )
         {
                can = mp[ A[r+1] ];
                
                if( !(can || dist + 1 <= LEN ) )
                   break;
                
                if( !can )
                    dist++;
                    
                mp[ A[r+1] ]++;  
                
                ++r;    
         }       
         
         mp[ A[i] ]--;
         
         if( !mp[A[i]] )
             dist--;
         
         ret += (long long)( r - i + 1 );
         
//         cout << i << " : : " << r << endl;
//         fflush( stdout );
     }
     
     return ret;
}

int main()
{
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);
    
    scanf("%d %d %d", &N, &L, &U);
    for( int i = 1; i <= N; i++ )
         scanf("%d", A + i );
    
    cout << doit( U ) - doit( L - 1 ) << endl;
    
    return 0;
}