Cod sursa(job #2657598)

Utilizator AlexNicuNicu Alexandru AlexNicu Data 11 octombrie 2020 10:52:21
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) {
    int p1, p2;
    long long ans = 0;
    reset();
    for (p1 = 1, p2 = 1; p2 <= n; p2++) {
        adauga(v[p2]);
        while (k > x)
            sterge(v[p1++]);
        ans = ans + 1LL * (p2 - p1 + 1);
    }
    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;
}