Pagini recente » Cod sursa (job #1145664) | Cod sursa (job #392046) | Cod sursa (job #2987788) | Cod sursa (job #2600263) | Cod sursa (job #10053)
Cod sursa(job #10053)
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
#define Nmax (1 << 20)
struct el
{
unsigned int val;
int poz;
} u[Nmax];
int v[Nmax];
int frec[Nmax];
int n, m, a, b;
void readdata()
{
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
scanf("%d %d %d", &n, &a, &b);
for (int i = 0; i < n; ++i)
{
scanf("%u", &u[i].val);
u[i].poz = i;
}
}
long long eval(int k)
{
int i, j = 0, cnt = 0;
long long rez = 0;
if (k == a-1) memset(frec, 0, sizeof(frec));
for (i = 0; i < n; ++i)
{
cnt += ++frec[v[i]] == 1;
while (1)
{
if (--frec[v[j]] == 0)
{
--cnt;
break;
}
++j;
}
rez += i-j+1;
}
return rez;
}
int inline cmp(struct el a, struct el b)
{
return a.val < b.val;
}
void solve()
{
int i;
sort(u, u+n, cmp);
v[ u[0].poz ] = 0;
for (i = 1; i < n; ++i)
{
if (u[i].val > u[i-1].val) ++m;
v[ u[i].poz ] = m;
}
printf("%lld\n", eval(b) - eval(a-1));
}
int main()
{
readdata();
solve();
return 0;
}