Pagini recente » Cod sursa (job #2963052) | Cod sursa (job #2583651) | Cod sursa (job #1927261) | Cod sursa (job #368161) | Cod sursa (job #1048061)
#include <iostream>
#include <fstream>
#include <cstdio>
#include <vector>
#include <ctype.h>
const static int NMAX = (1 << 20) + 10;
const static int MODULO = 666013;
using namespace std;
ifstream input("secv5.in");
ofstream output("secv5.out");
int nr_elemente;
int l , u;
unsigned int vect[NMAX];
vector<pair<unsigned int,int> > hashTable[MODULO];
char buffer[NMAX * 13];
void readDataFromInput()
{
int poz = 0;
input >> nr_elemente >> l >> u;
input.getline(buffer,13 * NMAX,EOF);
for(int i=0; i<nr_elemente; i++)
{
vect[i] = 0;
for(poz++;buffer[poz] >= '0' && buffer[poz] <= '9';poz++)
{
vect[i] = vect[i] * 10 + (buffer[poz] - '0');
}
}
}
void insertOrUpdate(const unsigned int & element)
{
int key = element % MODULO;
int i = 0;
bool was_found = false;
for (; i<hashTable[key].size() && !was_found; i++)
{
if (hashTable[key][i].first == element)
{
was_found = true;
i--;
}
}
if (!was_found)
hashTable[key].push_back(pair<int,int>(element,1));
else hashTable[key][i].second++;
}
void decrementValue(const unsigned int & element)
{
int key = element % MODULO;
int i = 0;
bool was_found = false;
int last = hashTable[key].size();
for (; i < last && !was_found; i++)
{
if (hashTable[key][i].first == element)
{
was_found = true;
i--;
}
}
if (was_found)
{
hashTable[key][i].second --;
if (hashTable[key][i].second == 0)
{
swap(hashTable[key][i] , hashTable[key][last-1]);
hashTable[key].pop_back();
}
}
}
bool valueExists(const unsigned int & element)
{
int key = element % MODULO;
int i = 0;
bool was_found = false;
for (; i<hashTable[key].size() && !was_found; i++)
{
if (hashTable[key][i].first == element)
{
return true;
}
}
return false;
}
long long nr_secvente(const int & max_diferite)
{
if (max_diferite == 0) return 0;
register int left = 0;
register int right = 0;
register int nr_diferite = 1;
register long long secvente = 0;
insertOrUpdate(vect[0]);
for (left = 0 ; left < nr_elemente; left++)
{
while (right < nr_elemente && nr_diferite <= max_diferite)
{
right++;
if (!valueExists(vect[right])) nr_diferite ++;
insertOrUpdate(vect[right]);
}
secvente += 1LL * (right - left);
decrementValue(vect[left]);
if (!valueExists(vect[left])) nr_diferite --;
}
return secvente;
}
int main()
{
readDataFromInput();
output << nr_secvente(u) - nr_secvente(l-1);
input.close();
output.close();
return 0;
}