Pagini recente » Cod sursa (job #1827047) | Cod sursa (job #178632) | Cod sursa (job #1518082) | Cod sursa (job #1627485) | Cod sursa (job #988744)
Cod sursa(job #988744)
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<fstream>
#include<ctype.h>
using namespace std;
ifstream f("secv5.in");
ofstream g("secv5.out");
#define MaxN ((1<<20)+100)
#define ll unsigned long long
#define ui unsigned int
int N,L,U,l,u,poz_l = 1,poz_u = 1;
ll Sol;
ui A[MaxN];
vector<pair<ui,int> > B;
int BestL[MaxN],BestU[MaxN];
char S[12*MaxN];
void citire(void)
{
int a = 0;
f >> N >> U >> L;
f.getline(S,12*MaxN,EOF);
for(int i=0;S[i];i++)
if(isdigit(S[i]))
for(A[++a] = 0;isdigit(S[i]);A[a] = A[a]*10+(S[i++]-'0'));
-- U;
}
void Normalizare(void)
{
int poz = 1;
for(int i=1;i<=N;i++)
B.push_back(make_pair(A[i],i));
sort(B.begin(),B.end());
A[B[0].second] = 1;
for(int i=1;i<N;i++)
{
if(B[i].first != B[i-1].first)
++ poz;
A[B[i].second] = poz;
}
}
inline void AdaugareL(int a)
{
l += (!BestL[a]);
BestL[a]++;
while(l>L)
{
a = A[poz_l];
BestL[a]--; poz_l ++;
if(!BestL[a])
-- l;
}
}
inline void AdaugareU(int a)
{
u += (!BestU[a]);
BestU[a] ++;
while(u>U)
{
a = A[poz_u];
BestU[a] --; poz_u ++;
if(!BestU[a])
--u;
}
}
void Rezolvare(void)
{
Normalizare();
for(int i=1;i<=N;i++)
{
AdaugareL(A[i]);
AdaugareU(A[i]);
Sol += (ll)poz_u-poz_l;
}
}
int main()
{
citire();
Rezolvare();
g << Sol << "\n";
}