实在想不明白,为什么这道题用树状数组不行。
使树状数组每个管理小组成员c[i]直接记录其所有子节点的积。先赋值c[i]均为1。接着每次输入a[i],并将所有后继节点(i+lowbit(i))乘以a[i]。然后恢复的时候再依次把后继节点除以该数a[i]。最后每次输出c[Q]。
我的代码可以通过样例,但是提交上去全部WA。十分不解,求大神解答,万分感谢。
#include<iostream>
using namespace std;
#define lowbit(x) ((-x)&x)
const __int128 MAXQ=100005;
long long Q,M,inpo,inpx,outp;
__int128 c[MAXQ];
long long a[MAXQ];
void update(__int128 x,__int128 val)
{
while(x<=Q)
{
c[x]*=val;
x=x+lowbit(x);
}
}
void undo(__int128 x)
{
__int128 t=a[x];
while(x<=Q)
{
c[x]/=t;
x=x+lowbit(x);
}
}
__int128 sum(__int128 x)
{
__int128 res=1;
while(x>0)
{
res*=c[x];
x=x-lowbit(x);
}
return res;
}
int main()
{
long long tt;
cin>>tt;
for(__int128 ti=0;ti<tt;ti++)
{
cin>>Q>>M;
for(__int128 i=0;i<=Q;i++)
{
a[i]=1;
}
for(__int128 i=0;i<=Q;i++)
{
c[i]=1;
}
for(__int128 i=1;i<=Q;i++)
{
cin>>inpo;
if(inpo==1)
{
cin>>a[i];
update(i,a[i]);
}
if(inpo==2)
{
cin>>inpx;
undo(inpx);
}
outp=sum(Q)%M;
cout<<outp<<endl;
}
}
return 0;
}