Pagini recente » Cod sursa (job #1877784) | Cod sursa (job #832791) | Cod sursa (job #2440729) | Cod sursa (job #2604759) | Cod sursa (job #712052)
Cod sursa(job #712052)
#include <fstream>
#include <vector>
#include <algorithm>
#define MOD 666013
#define DIM (1 << 20) + 1
using namespace std;
typedef unsigned long long LL;
ofstream fout("secv5.out");
int n, L, U;
vector<vector<int> > G;
vector<pair<int, int> > b;
int a[DIM];
LL Secv(int);
vector<int>::iterator Find(int x);
void Insert(int);
void Erase(int);
int main()
{
ifstream fin("secv5.in");
fin >> n >> L >> U;
int x;
for (int i = 1; i <= n; ++i)
{
fin >> x;
b.push_back(make_pair(x, i));
}
fin.close();
sort(b.begin(), b.end());
int norm = 0;
for (int i = 0; i < b.size(); ++i)
if (!i || b[i].first != b[i-1].first)
a[b[i].second] = ++norm;
else
a[b[i].second] = norm;
fout << Secv(1) << '\n';
fout.close();
return 0;
}
LL Secv(int dim)
{
if (!dim) return 0;
LL sol(0), nr(0);
G.clear(); G.resize(MOD);
for (int st = 1, dr = 1; dr <= n; ++dr)
{
if (Find(a[dr]) == G[a[dr]%MOD].end()) nr++;
Insert(a[dr]);
while (nr > dim && st <= dr)
{
Erase(a[st]);
if (Find(a[st]) == G[dr%MOD].end())
nr--;
st++;
}
sol += dr - st + 1;
}
return sol;
}
vector<int>::iterator Find(int x)
{
int list = x % MOD;
for (vector<int>::iterator it = G[list].begin(); it != G[list].end(); ++it)
if (*it == x) return it;
return G[list].end();
}
void Insert(int x)
{
G[x%MOD].push_back(x);
}
void Erase(int x)
{
vector<int>::iterator it = Find(x);
if (it != G[x%MOD].end())
G[x%MOD].erase(it);
}