Cod sursa(job #2657595)

Utilizator AlexNicuNicu Alexandru AlexNicu Data 11 octombrie 2020 10:48:38
Problema Secventa 5 Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
#include <vector>
#include <stdio.h>

using namespace std;

#define MOD 666013
#define N 1048576

ifstream cin( "secv5.in" );
ofstream cout( "secv5.out" );

vector < pair<unsigned int, unsigned int> > myHash[MOD];
int v[N];
unsigned int k;

void adauga( int x ) {
   unsigned int cod = x % MOD;
   unsigned int i = 0;
   while ( i < myHash[cod].size() && x != myHash[cod][i].first )
     i++;
   if ( i == myHash[cod].size() ) {
       myHash[cod].push_back({x, 1});
       k++;
   }
   else
    myHash[cod][i].second++;
}

void sterge ( int x ) {
   unsigned int cod = x % MOD;
   unsigned int i = 0;
   while ( i < myHash[cod].size() && x != myHash[cod][i].first )
     i++;
   if ( i < myHash[cod].size() ) {
      if ( myHash[cod][i].second > 1 )
        myHash[cod][i].second--;
      else {
        myHash[cod].erase( myHash[cod].begin() + i );
        k--;
      }
   }
}

bool cauta ( int x ) {
   unsigned int cod = x % MOD;
   unsigned int i = 0;
   while ( i < myHash[cod].size() && x != myHash[cod][i].first )
     i++;
   return i < myHash[cod].size();
}

void reset () {
    unsigned int i;
    k = 0;
    for ( i = 0; i < MOD; i++ ) {
       myHash[i].clear();
    }
}

long long solve ( int n, int x ) {
   reset();
   int st, dr;
   long long ans = 0;
   st = dr = 1;
   while ( dr <= n ) {
      adauga( v[dr] );
      while ( k > x )
        sterge( v[st++] );
      ans += 1LL * ( dr - st + 1 );
      dr++;
   }
   return ans;
}

int main() {
    int n, i, l, u;
    cin >> n >> l >> u;
    for ( i = 1; i <= n; i++ ) {
       cin >> v[i];
    }
    cout << solve( n, u ) - solve ( n, l - 1 );
    return 0;
}