模板
int d[maxn]; //下标从1开始
//num分块的个数
//block表示每个块所含的数的数量
//belong[i]表示下标为i的这个数属于哪一块
//l[i]表示第i块的左端点的下标
//r[i]表示右端点位置下标
//下标都是从1开始
void build(){
block=sqrt(n);
num=n/block;
if(n%block)num++;
for(int i=1;i<=num;i++)
l[i]=(i-1)*block+1,r[i]=i*block;
r[num]=n;
for(int i=1;i<=n;i++)
belong[i]=(i-1)/block+1;
}