解题思路:没多想,直接上主席树查询了。对每一个树做质因数分解,然后插入到主席树中,主席树维护质因数个数,然后直接查询数量即可。
踩了一个大坑,主席树每一次Update都要更新根节点……
#include
#include
#include
#include
using namespace std;
typedef long long int ll;
const int MAXN=100015;
typedef pair pii;
vector V[MAXN];
void init(){
int cnt;
for(int i=2; i 1){
V[i].push_back(make_pair(x, 1));
}
}
}
int N,Q;
int sum[MAXN*400];
int ls[MAXN*400];
int rs[MAXN*400];
int T[MAXN];
int tot=0;
void update(int P,int C,int l,int r,int &rt,int lrt){
rt=++tot;
ls[rt]=ls[lrt];
rs[rt]=rs[lrt];
sum[rt]=sum[lrt];
if(l==r){
sum[rt]+=C;
return;
}
int m=(l+r)/2;
if(P<=m)
update(P,C,l,m,ls[rt],ls[lrt]);
else
update(P,C,m+1,r,rs[rt],rs[lrt]);
}
int query(int L,int R,int l,int r,int rt,int lrt){
if(L<=l&&r<=R){
return sum[lrt]-sum[rt];
}
int m=(l+r)/2;
int ans=0;
if(L<=m)
ans+=query(L,R,l,m,ls[rt],ls[lrt]);
if(R>m)
ans+=query(L,R,m+1,r,rs[rt],rs[lrt]);
return ans;
}
int main()
{
init();
int tt;
scanf("%d",&tt);
while(tt--){
tot=0;
memset(sum,0,sizeof(sum));
memset(ls,0,sizeof(ls));
memset(rs,0,sizeof(rs));
int N,M;
scanf("%d%d",&N,&M);
int a;
for(int i=1;i<=N;i++){
scanf("%d",&a);
if(a==1)
T[i]=T[i-1];
else{
int pre=T[i-1];
for(int j=0;j