这两种分块有什么区别?
上面这个为什么不行?
void block(){
t=sqrt(n);
for(ri i=1;i<=t;++i)
l[i]=(i-1)*t+1,r[i]=i*t;
if(r[t]<n) l[++t]=r[t-1]+1,r[t]=n;
for(ri i=1;i<=t;++i)
for(ri j=l[i];j<=r[i];++j)
b[j]=i;
}
void block(){
t=sqrt(n);
for(ri i=1;i<=n;++i) b[i]=(i-1)/t+1;
for(ri i=1;i<=b[n];++i)
l[i]=(i-1)*t+1,r[i]=i*t;
r[b[n]]=min(r[b[n]],n);
}