Pagini recente » Cod sursa (job #1976576) | Borderou de evaluare (job #3162751) | Cod sursa (job #897194) | Cod sursa (job #2746348) | Cod sursa (job #1052385)
#include <fstream>
#include <vector>
#include <algorithm>
#include <string.h>
using namespace std;
const char infile[] = "secv5.in";
const char outfile[] = "secv5.out";
ifstream cin(infile);
ofstream cout(outfile);
const int MAXN = (1 << 20) + 1;
const int oo = 0x3f3f3f3f;
int N, L, U;
unsigned int Hash[MAXN], HashKey[MAXN];
vector <pair<int, int> > v;
inline bool addHash(const int &valueToAdd) {
if(++ Hash[valueToAdd] > 1)
return false; /// more than to valueToAdd in Hash
return true;
}
inline bool eraseHash(const int &valueToErase) {
if(-- Hash[valueToErase] == 0)
return true; /// nothing left here
return false;
}
inline int check(const int &maxDistinct) {
memset(Hash, (unsigned int)0, sizeof(Hash));
long long ret = 0;
for(int right = 0, left = 0, distinctElements = 0 ; right < N ; ++ right) {
if(addHash(HashKey[right]))
++ distinctElements;
while(distinctElements > maxDistinct) {
if(eraseHash(HashKey[left]))
-- distinctElements;
++ left;
}
if(distinctElements <= maxDistinct)
ret += right - left + 1;
}
return ret;
}
int main() {
cin >> N >> U >> L;
for(int i = 0 ; i < N ; ++ i) {
int x;
cin >> x;
v.push_back(make_pair(x, i));
}
stable_sort(v.begin(), v.end());
int counter = 0;
HashKey[v[0].second] = 0;
for(int i = 1 ; i < N ; ++ i) {
if(v[i].first == v[i-1].first)
HashKey[v[i].second] = HashKey[v[i-1].second];
else HashKey[v[i].second] = ++ counter;
}
unsigned long long Ans1 = check(L);
unsigned long long Ans2 = check(U - 1);
cout << Ans1 - Ans2 << '\n';
cin.close();
cout.close();
return 0;
}