WA on #2
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[300005],tree[1200005];
bool ok[400005];
void build(int l,int r,int i)
{
if(l==r)
{
tree[i]=a[l];
if(tree[i]==1||tree[i]==2)
{
ok[i]=true;
}
else
{
ok[i]=false;
}
return;
}
int mid=(l+r)/2;
build(l,mid,i*2);
build(mid+1,r,i*2+1);
tree[i]=tree[i*2]+tree[i*2+1];
ok[i]=(ok[i*2]&&ok[i*2+1]);
}
int q(int x)
{
int s=0;
for(int i=1;i*i<=x;i++)
{
if(x%i==0)
{
s+=2;
if(i==x/i)
{
s--;
}
}
}
return s;
}
void Set(int l,int r,int ll,int rr,int i)
{
if(ll>r||rr<l||ok[i])
{
return;
}
else if(l!=r)
{
int mid=(l+r)/2;
Set(l,mid,ll,rr,i*2);
Set(mid+1,r,ll,rr,i*2+1);
tree[i]=tree[i*2]+tree[i*2+1];
ok[i]=(ok[i*2]&&ok[i*2+1]);
}
else
{
tree[i]=q(tree[i]);
if(tree[i]==1||tree[i]==2)
{
ok[i]=true;
}
}
}
long long ask(int l,int r,int ll,int rr,int i)
{
if(ll>r||rr<l)
{
return 0;
}
else if(ll<=l&&r<=rr)
{
return tree[i];
}
else
{
int mid=(l+r)/2;
return ask(l,mid,ll,rr,i*2)+ask(mid+1,r,ll,rr,i*2+1);
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,n,1);
while(m--)
{
int opt,l,r;
cin>>opt>>l>>r;
if(opt==1)
{
Set(1,n,l,r,1);
}
else
{
cout<<ask(1,n,l,r,1)<<endl;
}
}
}