Cod sursa(job #2657600)

Utilizator AlexNicuNicu Alexandru AlexNicu Data 11 octombrie 2020 10:55:35
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 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 + 2];
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[code].size() ){
    --myhash[code][i].second;
    if( !myhash[code][i].second ){
      myhash[code].erase(myhash[code].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;
}