这里写一下树状数组的模板
/*树状数组大全 produced by Aixwu
*/
int lowbit(int x)
{
return x&(-x);
}
// 改点求段
void add_1(int x,int c)
{
for(int i=x;i<=n;i+=lowbit(i))
a[i]+=c;
}
int sum_1(int x)
{
int s=0;
for(int i=x;i>0;i-=lowbit(i))
s+=a[i];
return s;
}
void sol_1()
{
int x,c,l,r;
scanf("%d%d",&x,&c);
add_1(x,c);
scanf("%d%d",&l,&r);
ans=sum_1(r)-sum_1(l-1);
}
//改段求点
void add_2(int x,int c)
{
for(int i=x;i>0;i-=lowbit(i))
a[i]+=c;
}
int sum_2(int x)
{
int s=0;
for(int i=x;i<=n;i+=lowbit(i))
s+=a[i];
return s;
}
void sol_2()
{
int x,c,l,r;
scanf("%d%d%d",&l,&r,&c);
add_2(l-1,-c);
add_2(r,c);
scanf("%d",&x);
ans=sum(x);
}
//改段求段
void add_b(int x,int c)
{
for(int i=x;i>0;i-=lowbit(i))
b[i]+=c;
}
int sum_b(int x)
{
int s=0;
for(int i=x;i<=n;i+=lowbit(i))
s+=b[i];
}
void add_c(int x,int C)
{
for(int i=x;i<=n;i+=lowbit(i))
c[i]+=C*x;
}
int sum_c(int x)
{
int s=0;
for(int i=x;i>0;i-=lowbit(i))
s+=c[i];
}
int sum(int x)
{
if(x)return sum_b(x)*x+sum_c(x-1);
else return 0;
}
void sol_3()
{
int c,l,r,L,R;
scanf("%d%d%d",&l,&r,&c);
add_b(r,c);
add_c(r,c);
if(l>1)
{
add_b(l-1,-c);
add_c(l-1,-c);
}
scanf("%d%d",&L,&R);
ans=sum(R)-sum(L-1);
}
//求最大值
void addin()
{
for(int i=1;i<=n;i++)
{
maxv[i]=num[i];
for(int j=1;j<lowbit(i);j<<=1)
{
maxv[i]=max(maxv[i],maxv[i-j]);
}
}
}
void updata(int x,int c)
{
num[x]=c;
for(int i=x;i<=n;i+=lowbit(i))
{
maxv[i]=c;
for(int j=1;j<lowbit(i);j<<=1)
{
maxv[i]=max(maxv[i],maxv[i-j]);
}
}
}
int query(int l,int r)
{
int ans=num[r];
while(1)
{
ans=max(ans,num[r]);
if(l==r)break;
for(r-=1;r-l>=lowbit(r);r-=lowbit(r))
{
ans=max(ans,maxv[r]);
}
}
}
void sol()
{
addin();
int x,c,l,r;
scanf("%d%d",&x,&c);
updata(x,c);
scanf("%d%d",&l,&r);
ans=query(l,r);
}
int main()
{
}