#include <stdio.h>
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
#define f_inline inline __attribute__((always_inline))
#define reg register
const int MAXSIZE = 1 << 20;
char buf[MAXSIZE], *p1, *p2;
#define gc() \
(p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, MAXSIZE, stdin), p1 == p2) \
? EOF \
: *p1++)
char pbuf[1<<21];
int p, p3(-1);
void flush() {
fwrite(pbuf, 1, p3+1, stdout);
p3 = -1;
}
f_inline int uread(){
reg int x(0);
reg char ch;
while ((ch = gc()) < 48);
do{
x = (x << 1) + (x << 3) + (ch ^ 48);
}while ((ch = gc()) > 47);
return x;
}
void uprint(reg const long long x){
reg const long long tmp(x/10);
if (tmp) uprint(tmp);
pbuf[++p3] = (x-(tmp<<1)-(tmp<<3)+'0');
}
int a[100000];
int main(){
reg const int n(uread());
reg int m(uread());
reg int i(0);
for (; i<n-7; i += 8){
a[i] = uread();
a[i+1] = uread();
a[i+2] = uread();
a[i+3] = uread();
a[i+4] = uread();
a[i+5] = uread();
a[i+6] = uread();
a[i+7] = uread();
}
while (n-i) a[i++] = uread();
do{
reg const int op(uread()), l(uread()-1), r(uread()-1);
reg int i(l);
if (op == 1){
reg const int x(uread());
if (x == 2){
for (; i<=r-7; i+=8){
!(a[i]&1) ? a[i]>>=1 : 0;
!(a[i+1]&1) ? a[i+1]>>=1 : 0;
!(a[i+2]&1) ? a[i+2]>>=1 : 0;
!(a[i+3]&1) ? a[i+3]>>=1 : 0;
!(a[i+4]&1) ? a[i+4]>>=1 : 0;
!(a[i+5]&1) ? a[i+5]>>=1 : 0;
!(a[i+6]&1) ? a[i+6]>>=1 : 0;
!(a[i+7]&1) ? a[i+7]>>=1 : 0;
}
switch ((r-l+1) & 7){
case 7: !(a[r-6] & 1) ? a[r-6]>>=1 : 1;
case 6: !(a[r-5] & 1) ? a[r-5]>>=1 : 1;
case 5: !(a[r-4] & 1) ? a[r-4]>>=1 : 1;
case 4: !(a[r-3] & 1) ? a[r-3]>>=1 : 1;
case 3: !(a[r-2] & 1) ? a[r-2]>>=1 : 1;
case 2: !(a[r-1] & 1) ? a[r-1]>>=1 : 1;
case 1: !(a[r] & 1) ? a[r]>>=1 : 1;
}
}else if (n == 4){
for (; i<=r-7; i+=8){
!(a[i] & 3) ? a[i]>>=2 : 0;
!(a[i+1] & 3) ? a[i+1]>>=2 : 0;
!(a[i+2] & 3) ? a[i+2]>>=2 : 0;
!(a[i+3] & 3) ? a[i+3]>>=2 : 0;
!(a[i+4] & 3) ? a[i+4]>>=2 : 0;
!(a[i+5] & 3) ? a[i+5]>>=2 : 0;
!(a[i+6] & 3) ? a[i+6]>>=2 : 0;
!(a[i+7] & 3) ? a[i+7]>>=2 : 0;
}
switch ((r-l+1) & 7){
case 7: !(a[r-6] & 3) ? a[r-6]>>=2 : 1;
case 6: !(a[r-5] & 3) ? a[r-5]>>=2 : 1;
case 5: !(a[r-4] & 3) ? a[r-4]>>=2 : 1;
case 4: !(a[r-3] & 3) ? a[r-3]>>=2 : 1;
case 3: !(a[r-2] & 3) ? a[r-2]>>=2 : 1;
case 2: !(a[r-1] & 3) ? a[r-1]>>=2 : 1;
case 1: !(a[r] & 3) ? a[r]>>=2 : 1;
}
}else if (x > 2){
for (; i<=r-7; i+=8){
!(a[i]%x) ? a[i]/=x : 1;
!(a[i+1]%x) ? a[i+1]/=x : 1;
!(a[i+2]%x) ? a[i+2]/=x : 1;
!(a[i+3]%x) ? a[i+3]/=x : 1;
!(a[i+4]%x) ? a[i+4]/=x : 1;
!(a[i+5]%x) ? a[i+5]/=x : 1;
!(a[i+6]%x) ? a[i+6]/=x : 1;
!(a[i+7]%x) ? a[i+7]/=x : 1;
}
switch ((r-l+1) & 7){
case 7: !(a[r-6] % x) ? a[r-6] /= x : 1;
case 6: !(a[r-5] % x) ? a[r-5] /= x : 1;
case 5: !(a[r-4] % x) ? a[r-4] /= x : 1;
case 4: !(a[r-3] % x) ? a[r-3] /= x : 1;
case 3: !(a[r-2] % x) ? a[r-2] /= x : 1;
case 2: !(a[r-1] % x) ? a[r-1] /= x : 1;
case 1: !(a[r] % x) ? a[r] /= x : 1;
}
}
}else{
reg long long sum1(0), sum2(0), sum3(0), sum4(0), sum5(0), sum6(0), sum7(0), sum8(0);
for(; i<r-7; i+=8){
sum1 += a[i];
sum1 += a[i+1];
sum2 += a[i+2];
sum3 += a[i+3];
sum4 += a[i+4];
sum5 += a[i+5];
sum6 += a[i+6];
sum7 += a[i+7];
}
switch ((r-l+1) & 7){
case 7: sum7 += a[r-6];
case 6: sum6 += a[r-5];
case 5: sum5 += a[r-4];
case 4: sum4 += a[r-3];
case 3: sum3 += a[r-2];
case 2: sum2 += a[r-1];
case 1: sum1 += a[r];
}
if (p3 > (1 << 20)) flush();
uprint(sum1+sum2+sum3+sum4+sum5+sum6+sum7+sum8);
pbuf[++p3] = '\n';
}
// for (reg int i(0); i<n; ++i){
// uprint(a[i]);
// pbuf[++p3] = ' ';
// }
// pbuf[++p3] = '\n';
}while (--m);
flush();
return 0;
}
样例太水了……