Pagini recente » Cod sursa (job #306431) | Cod sursa (job #2373312) | Cod sursa (job #2619376) | Cod sursa (job #2546331) | Cod sursa (job #1579376)
#include<cstdio>
using namespace std;
const int nMax = (1 << 20) + 1, R = 666013;
unsigned int dq[2][nMax], dim[2][2], n, l, u, v[nMax], vf[2], sol, nrDif[2], pozp;
unsigned int nrAp[2][nMax], val[2][nMax], urm[2][nMax], lst[2][R];
unsigned int gaseste (unsigned int x, unsigned int ind){
unsigned int tip = x % R, poz = lst[ind][tip];
pozp = -1;
while(poz){
if(val[ind][poz] == x)
return poz;
pozp = poz;
poz = urm[ind][poz];
}
return poz;
}
inline void adauga(unsigned int x, unsigned int ind, unsigned int i){
dq[ind][++dim[ind][1]] = i;
unsigned int tip = x % R, poz = gaseste(x, ind);
if(poz){
nrAp[ind][poz]++;
}else{
nrDif[ind]++;
val[ind][++vf[ind]] = x;
nrAp[ind][vf[ind]] = 1;
urm[ind][vf[ind]] = lst[ind][tip];
lst[ind][tip] = vf[ind];
}
}
inline void scoate(unsigned int lim, unsigned int ind){
unsigned int tip, x, poz;
bool ok = true;
while(nrDif[ind] >= lim && ok){
x = v[dq[ind][dim[ind][0]++]];
poz = gaseste(x, ind);
nrAp[ind][poz]--;
if(!nrAp[ind][poz] && lim == l && nrDif[ind] == lim){
ok = false;
dim[ind][0]--;
nrAp[ind][poz]++;
}
if(!nrAp[ind][poz] && ok){
nrDif[ind]--;
tip = x % R;
if(poz == lst[ind][tip]){
lst[ind][tip] = urm[ind][poz];
}else{
urm[ind][pozp] = urm[ind][poz];
}
}
}
}
int main (){
FILE *in = fopen("secv5.in","r");
FILE *out = fopen("secv5.out","w");
fscanf(in,"%u%u%u", &n, &l, &u);
dim[0][0] = dim[1][0] = 1;
unsigned int l1, l2;
for(unsigned int i = 1 ; i <= n ; ++i){
fscanf(in,"%u", v + i);
adauga(v[i], 0, i);
adauga(v[i], 1, i);
scoate(l, 0);
scoate(u + 1, 1);
if(nrDif[0] == l){
l1 = dq[0][dim[0][1]] - dq[0][dim[0][0]];
l2 = dq[1][dim[1][1]] - dq[1][dim[1][0]];
sol += 1 + (l2 - l1);
}
}
fprintf(out,"%u\n", sol);
return 0;
}