Cod sursa(job #2657542)

Utilizator Asgari_ArminArmin Asgari Asgari_Armin Data 10 octombrie 2020 21:48:37
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include <vector>

using namespace std;

const int NMAX = (1 << 20);
const int MOD = 666013;
unsigned int v[NMAX + 2];
vector < pair<unsigned int, unsigned int> > myhash[MOD];
unsigned int k;

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

void erase_hash( unsigned int x ){
  unsigned int i = 0, code = x % MOD;
  while( i < myhash[code].size() && x != myhash[code][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 search_hash( unsigned int x ){
  unsigned int i = 0, code = x % MOD;
  while( i < myhash[code].size() && x != myhash[code][i].first )
    ++i;
  return i < myhash[code].size();
}

void reset(){
  unsigned int i;
  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++) {
        add_hash(v[p2]);
        while (k > x)
            erase_hash(v[p1++]);
        ans = ans + 1LL * (p2 - p1 + 1);
    }
    return ans;
}


int main() {
  ifstream fin( "secv5.in" );
  ofstream fout( "secv5.out" );
  int n, l, u, i;
  fin >> n >> l >> u;
  for( i = 1; i <= n; ++i )
    fin >> v[i];
  fout << solve(n, u) - solve(n, l - 1);
  return 0;
}