Cod sursa(job #2881493)

Utilizator tudorcomanTudor Coman tudorcoman Data 30 martie 2022 15:35:43
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb

#include <cstdio>
#include <vector>

using namespace std;

const int maxN = 1 << 20;
int v[maxN + 1];

class Hash {
private:
  const static int mod = 123457;
  vector<vector<unsigned int> > table;
  int dim; 
public:
  Hash() {table.resize(mod);}
  int search(int value) const {
    int rem = value % mod;
    for(int i = 0; i < (int)table[rem].size(); ++ i)
      if(table[rem][i] == value)
        return i;
    return -1;
  }
 
  inline void insert(int value) {
    if(search(value) == -1) dim ++;
    table[value % mod].push_back(value);
  }
 
  inline void erase(int value) {
    int rem = value % mod;
    int s = table[rem].size() - 1;
    int pos = this->search(value);
    if(pos != -1) {
      table[rem][pos] = table[rem][s];
      table[rem].pop_back();
    }
    if(search(value) == -1) dim --;
  }

  inline int size() {
      return dim;
  }
} hashuri[2];

int main() {
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);

    int N, l, u;
    scanf("%d %d %d", &N, &l, &u);
    
    int a, b; a = b = 0;
    int st = 0;

    for (int i = 0; i < N; i ++) {
        scanf("%d", &v[i]);
        hashuri[0].insert(v[i]);
        while(hashuri[0].size() > u)
            hashuri[0].erase(v[st ++]);
        a += (i - st + 1);
    }

    st = 0;
    for (int i = 0; i < N; i ++) {
        hashuri[1].insert(v[i]);
        while (hashuri[1].size() >= l)
            hashuri[1].erase(v[st ++]);
        b += (i - st + 1);
    }


    printf("%d\n", a-b);
    return 0;
}