Pagini recente » Arhiva de probleme | Rating Golumbeanu Monica (monica88) | Cod sursa (job #1176709) | Cod sursa (job #1981151) | Cod sursa (job #1573996)
#include <iostream>
#include <fstream>
#include <vector>
#define UI unsigned int
#define pii pair <UI, UI>
#define pb push_back
#define mp make_pair
using namespace std;
const int NMax = (1<<20) + 10;
const int MOD = 666013;
vector <pii> H[MOD];
int L, U, N;
UI a[NMax];
void Insert(const UI x)
{
int cod = x % MOD;
for (vector <pii> :: iterator it = H[cod].begin(); it != H[cod].end(); ++ it)
if (it -> first == x)
{
++ it -> second;
return ;
}
H[cod].pb(mp(x, 1));
}
int Search(const UI x)
{
int cod = x % MOD;
for (vector <pii> :: iterator it = H[cod].begin(); it != H[cod].end(); ++ it)
if (it -> first == x)
return it -> second;
return 0;
}
int Delete(const UI x)
{
int cod = x % MOD;
for (vector <pii> :: iterator it = H[cod].begin(); it != H[cod].end(); ++ it)
if (it -> first == x)
{
-- it -> second;
if (it -> second == 0)
{
*it = H[cod].back();
H[cod].pop_back();
return 0;
}
return it -> second;
}
return 0;
}
long long Solve(const int SZ)
{
long long ret = 0;
for (int i = 0; i < MOD; ++ i)
H[i].clear();
int st = 1, dr;
int count = 0;
for (dr = 1; dr <= N; ++ dr)
{
if (Search(a[dr]) == 0)
++ count;
Insert(a[dr]);
while (count > SZ)
{
int rem = Delete(a[st]);
if (rem == 0)
-- count;
++ st;
}
ret += (dr - st + 1);
}
return ret;
}
int main()
{
ifstream f ("secv5.in");
f >> N >> L >> U;
for (int i = 1; i <= N; ++ i)
f >> a[i];
f.close();
ofstream g ("secv5.out");
g << Solve(U) - Solve(L-1) << "\n";
g.close();
return 0;
}