加上快读快些还是 88pts
```cpp
#include<bits/stdc++.h>
using namespace std;
int read()
{
int get=0,w=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
w=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
get=get*10+c-'0';
c=getchar();
}
return get*w;
}
void write(long long x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>=10)
write(x/10);
putchar(x%10+'0');
}
int i,j,l,r,x,n,m,type,num[100001];
long long s;
int main()
{
n=read(),m=read();
for(register int i=1;i<=n;i++)
num[i]=read();
for(i=1;i<=m;i++)
{
type=read();
if(type==1)
{
l=read(),r=read(),x=read();
for(register int j=l;j<=r;j++)
if(num[j]%x==0)
num[j]/=x;
}
else
{
s=0;
l=read(),r=read();
for(register int j=l;j<=r;j++)
s+=num[j];
write(s);
putchar('\n');
}
}
return 0;
}
```
by liupan2010 @ 2023-03-31 21:34:54
加上分类讨论和位运算 91 pts
不会循环展开。
```cpp
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int get=0,w=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
w=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
get=get*10+c-'0';
c=getchar();
}
return get*w;
}
inline void write(long long x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>=10)
write(x/10);
putchar(x%10+'0');
}
int i,j,l,r,x,n,m,type,num[100001];
long long s;
int main()
{
n=read(),m=read();
for(register int i=1;i<=n;i++)
num[i]=read();
for(i=1;i<=m;i++)
{
type=read();
if(type==1)
{
l=read(),r=read(),x=read();
if(x>=2)
{
for(register int j=l;j<=r;j++)
if(num[j]%x==0)
num[j]/=x;
}
else if(x==2)
{
for(register int j=l;j<=r;j++)
if(num[j]&1==0)
num[j]>>=1;
}
}
else
{
s=0;
l=read(),r=read();
for(register int j=l;j<=r;j++)
s+=num[j];
write(s);
putchar('\n');
}
}
return 0;
}
```
by liupan2010 @ 2023-03-31 21:40:43
@[liupan2010](/user/875806) 试一下 `fread` 和 `fwrite`?
by rainygame @ 2023-04-30 22:52:11
已经 A 了,但还是 thx.
by liupan2010 @ 2023-05-01 07:54:06