请帮帮忙,这个程序不知道哪里错了,输不出结果

#include

using namespace std;

const int maxN=200000;

const int max=100000; //设定技能值最大为100000

int a[max],x,y,b[maxN];

int Lowbit(int x) //返回二进制最后一个1所表示的数

{ return x&(-x);}

void update (int x,int val) //向前更新

{while (x<=maxN)

{b[x]=b[x]+val;

x=x+Lowbit(x);

}

}

int sum(int x) //向右更新求和

{int sum=0;

while (x>0)

{ sum=sum+b[x];

x=x-Lowbit(x);

}

return sum;

}

int main()

{ int i,t,n;

long int m=0;

scanf("%d",&t);

while(t--)

{ scanf("%d",&n);

scanf("%d", &a[1]);

memset(b, 0, sizeof(b));//初始化树状组

scanf("%d", &a[1]);

for(i=1;i<=n;i++)

{scanf("%d",&a[i]);}

update(a[1], 1);

for(i=1;i<=n;i++)

{

scanf("%d", &a[i]);

update(a[i], 1);

x= sum(a[i] - 1);

}

scanf("%d", &a[n]);

memset(b, 0, sizeof(b)); ///注意这里要清空

update(a[n], 1);

for(i=n;i>0;i--)

{update(a[i], 1);

y=sum(a[i]-1);

}

for(i=2;i<=n;i++)

{m=m+x*(n-i-y)+y*(i-1-x);

}

printf("%lld\n",m);;

}

return 0;

}

建议楼主自己单步一下,看看每一步得到的值是不是正确,不然你那么多scanf要看懂也不容易。。。
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。