可引起RE(ACCESS_VIOLATION)的建树操作
{
int k=1;
L[1]=1;R[1]=maxn;
for(int i=1;i<=maxn;i++)
if (L[i]<R[i])
{
k++;L[k]=L[i];R[k]=(L[i]+R[i])/2;
k++;L[k]=(L[i]+R[i])/2+1;R[k]=R[i];
}
}
修正
void build(int l,int r,int k)
{
L[k]=l;R[k]=r;mid[k]=(l+r)>>1;
v[k]=1;
if (l<r)
{
build(l,mid[k],k<<1);
build(mid[k]+1,r,(k<<1)|1);
}
}
冗杂的修改操作,一念之差,
void modify(int k,int x,int y,int num)
{
if (x>L[k]||y<R[k]) v[k]=(v[k]==num)?num:0;
else if (x==L[k]&&y==R[k]) v[k]=num;
if (L[k]==R[k]) return;
if (x<=mid[k]) modify(k<<1,x,min(mid[k],y),num);
if (y>mid[k]) modify((k<<1)|1,max(x,mid[k]+1),y,num);
//v[k]=v[k<<1]+v[(k<<1)|1];
}
void modify(int k,int x,int y,int num)
{
if (v[k]==num) return;
if (x==L[k]&&y==R[k])
{
v[k]=num;return;
};
if (v[k]) v[k<<1]=v[(k<<1)|1]=v[k];
v[k]=0;
if (x<=mid[k]) modify(k<<1,x,min(mid[k],y),num);
if (y>mid[k]) modify((k<<1)|1,max(x,mid[k]+1),y,num);
//v[k]=v[k<<1]+v[(k<<1)|1];
}