Pagini recente » Cod sursa (job #2212166) | Cod sursa (job #357591) | Cod sursa (job #3192053) | Cod sursa (job #667784) | Cod sursa (job #1189089)
#include <fstream>
using namespace std;
ifstream in("secv5.in");
ofstream out("secv5.out");
const int MAX_N = 1 << 20, KEY = 1 << 13;
int lst[KEY], urm[MAX_N+1], val[MAX_N+1], v[MAX_N+1];
int n, l, u;
int nr;
int nrdif, drl, dru, st = 1;
bool inline check(int x)
{
int p = lst[x&(KEY-1)];
while(p != 0 && val[p] != x)
{
p = urm[p];
}
return p != 0;
}
void inline del(int x)
{
int r = x&(KEY-1), p;
if(x == val[lst[r]])
{
lst[r] = urm[lst[r]];
return;
}
p = lst[r];
while(urm[p] != 0 && val[urm[p]] != x)
{
p = urm[p];
}
if(val[urm[p]] == x)
{
urm[p] = urm[urm[p]];
}
if(!check(x))
{
nrdif--;
}
}
void inline add(int x)
{
if(!check(x))
{
nrdif++;
}
int place = x&(KEY-1);
val[++nr] = x;
urm[nr] = lst[place];
lst[place] = nr;
}
int main()
{
int nrsub = 0;
in >> n >> l >> u;
int x;
for(int i = 1; i <= n; i++)
{
in >> v[i];
}
while(st <= n)
{
while(nrdif < l && drl < n)
{
add(v[++drl]);
}
if(drl < st)
{
drl = st;
}
if(dru < drl)
{
dru = drl;
}
if(nrdif >= l && nrdif <= u)
{
nrsub += dru-drl+1;
}
while(nrdif < u && dru < n)
{
add(++dru);
nrsub++;
}
del(v[st]);
st++;
}
out << nrsub;
return 0;
}