Pagini recente » Cod sursa (job #684498) | Cod sursa (job #2734664) | Cod sursa (job #2235963) | Cod sursa (job #2962728) | Cod sursa (job #1964912)
#include <iostream>
#include <fstream>
#include <vector>
#define el first
#define ap second
#define mod 11311
#define FOR(i, x, y) for(int i = x; i <= y; ++i)
#define FORR(i, x, y) for(int i = x; i >= y; --i)
#define pb(x) push_back(x)
#define nMax (1 << 20) + 5
using namespace std;
vector < pair<unsigned int, unsigned int> > v[2][mod + 4];
unsigned int a[nMax], n, l, u;
int Find(int x, int type)
{
if(v[type][x % mod].size() != 0)
FOR(i, 0, v[type][x % mod].size() - 1)
if(v[type][x % mod][i].el == x) return 1;
return 0;
}
void Insert(int x, int type)
{
if(v[type][x % mod].size() != 0)
FOR(i, 0, v[type][x % mod].size() - 1)
if(v[type][x % mod][i].el == x) {
v[type][x % mod][i].ap++;
return;
}
v[type][x % mod].pb(make_pair(x, 1));
}
void Delete(int x, int type)
{
int p = -1;
if(v[type][x % mod].size() != 0)
FOR(i, 0, v[type][x % mod].size() - 1)
if(v[type][x % mod][i].el == x) {
if(v[type][x % mod][i].ap > 1){
v[type][x % mod][i].ap--;
return;
}
p = i;
break;
}
if(p != -1) v[type][x % mod].erase(v[type][x % mod].begin() + p);
}
int main()
{
ifstream fin("secv5.in");
ofstream fout("secv5.out");
fin >> n >> l >> u;
FOR(i, 1, n)
fin >> a[i];
unsigned int index = 1, dr = 0, Dr = 0, dif = 0, Dif = 0;
unsigned long long sol = 0;
while(1){
dr++;
Dr++;
while(dr <= n && dif < l){
if(!Find(a[dr], 0)) ++dif;
Insert(a[dr], 0);
dr++;
}
dr--;
while(Dr <= n){
if(!Find(a[Dr], 1)){
if(Dif + 1 > u) break;
++Dif;
}
Insert(a[Dr], 1);
Dr++;
}
Dr--;
if(dif < l) break;
sol += Dr - dr + 1;
Delete(a[index], 0);
if(!Find(a[index], 0)) dif--;
Delete(a[index], 1);
if(!Find(a[index], 1)) Dif--;
++index;
if(dr == n) break;
}
fout << sol;
return 0;
}