版权声明:转载者乖乖♂站好 https://blog.csdn.net/Eric1561759334/article/details/82733426
树状数组
int lowbit(int x)
{
return x&-x;
}
void insert(int x,int d)
{
sum+=d;
for(; x<=mx; x+=lowbit(x)) s[x]+=d;
}
int query(int x)
{
int p=0;
for(; x; x-=lowbit(x)) p+=s[x];
return sum-p;
}
线段树
void ins(int st,int ed,int l,int r,int c,int u)
{
if(l>r) return;
if(c==a[u]) return;
if(st==l&&ed==r) a[u]=c;else
{
if(a[u]!=-1) a[u*2+1]=a[u],a[u*2]=a[u],a[u]=-1;
int mid=(st+ed)>>1;
if(r<=mid) ins(st,mid,l,r,c,u*2);else
if(l>mid) ins(mid+1,ed,l,r,c,u*2+1);else
{
ins(st,mid,l,mid,c,u*2);
ins(mid+1,ed,mid+1,r,c,u*2+1);
}
}
}
int query(int l,int r,int u,int &lc,int &rc)
{
int lt=0,rt=0;
if(a[u]!=-1)
{
rc=lc=a[u];
return 1;
}
if(l==r) return 1;
int mid=(l+r)>>1,s=query(l,mid,u*2,lc,lt)+query(mid+1,r,u*2+1,rt,rc);
return s-(lt==rt?1:0);
}
GCD
void add(int u,int v)
{
e[++cnt].to=v; e[cnt].next=list[u]; list[u]=cnt;
}
void dfs(int r,int fa)
{
d[r]=d[fa]+1;
p[r][0]=fa;
for(int i=1; (1<<i)<=d[r]; i++) p[r][i]=p[p[r][i-1]][i-1];
for(int i=list[r]; i!=-1; i=e[i].next)
{
int u=e[i].to;
if(u!=fa) dfs(u,r);
}
}
int gcd(int x,int y)
{
if(d[x]>d[y]) swap(x,y);
for(int i=ln; i>=0; i--)
{
if(d[x]<=d[y]-(1<<i)) y=p[y][i];
}
if(x==y) return x;
for(int i=ln; i>=0; i--)
{
if(p[x][i]==p[y][i]) continue;else
{
x=p[x][i]; y=p[y][i];
}
}
return p[x][0];
}