Pagini recente » Cod sursa (job #1373287) | Cod sursa (job #1099176) | Cod sursa (job #2149993) | Rating Crisan Ina (crisanina) | Cod sursa (job #483175)
Cod sursa(job #483175)
#include <cstdio>
#include <vector>
using namespace std;
const int NMAX = 1050000;
const int MOD = 997037;
struct nod {
unsigned int v; int nr;
nod *next;
} *HASH1[MOD + 50], *HASH2[MOD + 50];
char buffer[NMAX * 10];
int MIN[NMAX], MAX[NMAX], n, dmin, dmax, d;
unsigned int A[NMAX];
void citire (), calcul (), adauga (nod*&, unsigned int), sterge (nod*&, unsigned int), afisare ();
int main () {
citire ();
calcul ();
afisare ();
return 0;
}
void citire () {
freopen ("secv5.in", "r", stdin);
int i, j;
unsigned int x;
fread (buffer, sizeof (buffer), 1, stdin);
i = 0;
for (x = 0; buffer[i] >= '0' && buffer[i] <= '9'; i++)
x = x * 10 + (buffer[i] - '0');
n = (int) x;
i++;
for (x = 0; buffer[i] >= '0' && buffer[i] <= '9'; i++)
x = x * 10 + (buffer[i] - '0');
dmin = (int) x;
i++;
for (x = 0; buffer[i] >= '0' && buffer[i] <= '9'; i++)
x = x * 10 + (buffer[i] - '0');
dmax = (int) x;
for (j = 1; j <= n; j++) {
x = 0, i++;
while (buffer[i] >= '0' && buffer[i] <= '9')
x = x * 10 + (buffer[i++] - '0');
A[j] = x;
}
}
void calcul () {
int p, u;
p = 1, u = 0;
while (p <= n && u < n) {
u++;
adauga (HASH1[A[u] % MOD], A[u]);
while (d > dmax) {
sterge (HASH1[A[p] % MOD], A[p]);
p++;
}
MAX[u] = p;
}
p = n, u = n, d = 0;
while (p >= 0 && u > 0) {
if (p == 0 && d >= dmin)
MIN[u] = 1;
else if (p == 0)
break;
while (d < dmin) {
adauga (HASH2[A[p] % MOD], A[p]);
p--;
}
MIN[u] = p + 1;
sterge (HASH2[A[u] % MOD], A[u]);
u--;
}
}
void adauga (nod *&H, unsigned int x) {
nod *p;
for (p = H; p != NULL; p = p -> next)
if (p -> v == x) {
p -> nr++;
return;
}
p = new nod; d++;
p -> v = x, p -> nr = 1, p -> next = H;
H = p;
}
void sterge (nod *&H, unsigned int x) {
nod *p, *aux;
for (p = H; p != NULL; p = p -> next)
if (p -> v == x) {
p -> nr--;
if (p -> nr == 0) {
if (p == H) {
aux = H, H = H -> next;
delete aux;
}
else {
aux = p, p = p -> next;
delete aux;
}
d--;
}
return;
}
}
void afisare () {
freopen ("secv5.out", "w", stdout);
int i; long long sol = 0;
for (i = 1; i <= n; i++)
if (MIN[i] >= MAX[i] && MIN[i] > 0)
sol += MIN[i] - MAX[i] + 1;
printf ("%lld", sol);
}