Pagini recente » Cod sursa (job #558315) | Cod sursa (job #832469) | Cod sursa (job #1879538) | Cod sursa (job #2427933) | Cod sursa (job #2956380)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("secv5.in");
ofstream fout("secv5.out");
unsigned int t[1100001], n, v[1100001], k, L, U, last[1100001];
void add(unsigned int poz, unsigned int val)
{
for (int i = poz; i <= n; i += (i & (-i)))
t[i] += val;
}
unsigned int get(unsigned int poz)
{
unsigned int sum = 0;
for (int i = poz; i; i -= (i & (-i)))
sum += t[i];
return sum;
}
unsigned int cb(unsigned int val)
{
unsigned int l = 1, r = k;
while (l <= r)
{
unsigned int m = ((l + r) >> 1);
if (v[m] == val)
return m;
if (v[m] < val)
l = m + 1;
else
r = m - 1;
}
return 0; // unreachable
}
int main() {
fin >> n >> L >> U;
for (unsigned int i = 1; i <= n; i++)
fin >> v[i];
sort(v + 1, v + n + 1);
k = 0;
unsigned int i = 1;
while (i <= n)
{
v[++k] = v[i++];
while (i <= n && v[i] == v[k])
i++;
}
fin.close();
fin.open("secv5.in");
fin >> n >> L >> U;
long long cnt = 0;
unsigned int start = 1, l, r, poz;
for (int i = 1; i <= n; i++)
{
unsigned int x;
fin >> x;
x = cb(x);
if (!last[x])
add(i, 1), last[x] = i;
else
{
add(last[x], -1);
add(i, 1);
last[x] = i;
}
while (get(i) - get(start - 1) > U)
start++;
if (get(i) - get(start - 1) < L)
continue;
l = start, r = i, poz = 0;
while (l <= r)
{
unsigned int m = ((l + r) >> 1);
if (get(i) - get(m - 1) < L)
r = m - 1;
else
{
poz = m;
l = m + 1;
}
}
cnt += poz - start + 1;
}
fout << cnt;
return 0;
}