HAHA!!!
Zrobione!
Dodałem dwie linijki i mam ponad 3x lepszy czas! Dzięki za wszelką pomoc, wpadłem na to dzięki Twojemu <windows.h> :D
#include <stdio.h>
#include <string.h>
#define ui unsigned int
inline void READ(ui t[], ui L)
{
for(ui i=0; i<L; i++)
scanf("%u", &t[i]);
}
inline void PRINT(ui t[], ui L)
{
printf("DRUKOWANIE: ");
for(ui i=0; i<L; i++)
printf("%u ", t[i]);
printf("\n");
}
inline void ADD(ui t[], ui pointer)
{
t[pointer-1]++;
}
inline void SUB(ui t[], ui pointer)
{
t[pointer-1]--;
}
inline void CLEAR(ui t[], ui size)
{
memset(t, 0, size*sizeof(unsigned int));
}
ui CHECQUE(ui t[], ui size)
{
for(ui i=0; i<size; i++)
if(t[i]<1)
return 0;
return 1;
}
ui CHECQUE_ELEMENT(ui t[], ui element)
{
if (t[element-1]>0) return 1;
return 0;
}
ui SEARCHEND(ui t[], ui begining, ui end, ui v[], ui vend)
{
for(ui i=begining; i<end; i++)
{
if(!CHECQUE_ELEMENT(v, t[i]))
{
ADD(v, t[i]);
if(CHECQUE(v, vend)) return i;
}
else
ADD(v, t[i]);
}
return 0;
}
ui SEARCHBEGIN(ui t[], ui begining, ui end, ui v[], ui vend)
{
ui temp=0;
for(ui i=begining; ; i++)
{
SUB(v, t[i]);
temp=i;
if (!CHECQUE_ELEMENT(v, t[i])) break;
}
return temp;
}
ui M(ui a, ui b)
{
if(b<a) a=b;
return a;
}
int main() {
ui n, L;
scanf("%u%u", &n, &L);
ui v[n], tab[L];
CLEAR(v, n);
READ(tab, L);
ui min=16843009, begin=0, end=0;
while(begin!=L-n-1)
{
end=SEARCHEND(tab, end, L, v, n);
if (end==0) break;
begin=SEARCHBEGIN(tab, begin, L, v, n);
min=M(min, end-begin+1);
if(min==n) break;
begin++;
end++;
}
printf("%u", min);
}
Szkoda, że nie mogę Ci wstawić setki plusów :) Tyle godzin nad tym siedziałem!