Ok, ten dość irytujący błąd naprawiony, a jeszcze pomyślałem o drobnym skróceniu jednej z pętli. Takie są efekty:
#include<cstdio>
int main()
{
int n,x,q,a[10000],b[10000],i,l,j,*ile,amin=-1,bmax=-1;
bool *t;
t=new bool[1000001];
ile=new int[1000001];
for(i=0;i<1000001;i++)
{
t[i]=false;
}
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&x);
for(j=x;j<1000001;j+=x)
{
t[j]=true;
}
}
scanf("%d",&q);
for(i=0;i<q;i++)
{
scanf("%d%d",&a[i],&b[i]);
if((amin==-1)||(amin>a[i]))
{
amin=a[i];
}
if((bmax==-1)||(bmax<b[i]))
{
bmax=b[i];
}
}
l=0;
for(i=amin;i<=bmax;i++)
{
if(!t[i])
{
l++;
}
ile[i]=l;
}
for(i=0;i<q;i++)
{
l=ile[b[i]]-ile[a[i]];
if(!t[a[i]])
{
l++;
}
printf("%d\n",l);
}
}
Ale jak się okazuje wszystko na nic, no bo przekroczono limit czasu. Czy ten kod da się jakoś ulepszyć, czy może chodzi tu o coś zupełnie innego?