#include <iostream>
using namespace std;
struct node
{
long long ssum, sum;
bool chl0, chl1;
long long l0, l1;
};
void build (long long *ar, long long lo, long long hi, node *segtree, long long pos)
{
if(lo == hi)
{
segtree[pos].ssum = ar[lo] * ar[lo];
segtree[pos].sum = ar[lo];
segtree[pos].l0 = 0;
segtree[pos].l1 = 0;
segtree[pos].chl0 = 0;
segtree[pos].chl1 = 0;
return;
}
long long mid = (lo + hi)/2;
build(ar, lo, mid, segtree, 2 * pos + 1);
build(ar, mid + 1, hi, segtree, 2 * pos + 2);
segtree[pos].ssum = segtree[2 * pos + 1].ssum + segtree[2 * pos + 2].ssum;
segtree[pos].sum = segtree[2 * pos + 1].sum + segtree[2 * pos + 2].sum;
segtree[pos].l0 = 0;
segtree[pos].l1 = 0;
segtree[pos].chl0 = 0;
segtree[pos].chl1 = 0;
}
void pro0(long long lo, long long hi, node *segtree, long long pos)
{
if(segtree[pos].chl0 != 0)
{
segtree[pos].ssum = segtree[pos].l0 * segtree[pos].l0 * (hi - lo + 1);
segtree[pos].sum = segtree[pos].l0 * (hi - lo + 1);
if(lo != hi)
{
segtree[2 * pos + 1].l0 = segtree[pos].l0;
segtree[2 * pos + 2].l0 = segtree[pos].l0;
segtree[2 * pos + 1].chl0 = 1;
segtree[2 * pos + 2].chl0 = 1;
segtree[2 * pos + 1].chl1 = 0;
segtree[2 * pos + 2].chl1 = 0;
}
segtree[pos].l0 = 0;
segtree[pos].l1 = 0;
segtree[pos].chl0 = 0;
segtree[pos].chl1 = 0;
}
return;
}
void pro1(long long lo, long long hi, node *segtree, long long pos)
{
if(segtree[pos].chl1 != 0)
{
segtree[pos].ssum += (hi - lo + 1) * segtree[pos].l1 * segtree[pos].l1 + 2 * segtree[pos].sum * segtree[pos].l1;
segtree[pos].sum += (hi - lo + 1) * segtree[pos].l1;
if(lo != hi)
{
segtree[2 * pos + 1].l1 += segtree[pos].l1;
segtree[2 * pos + 2].l1 += segtree[pos].l1;
segtree[2 * pos + 1].chl1 = 1;
segtree[2 * pos + 2].chl1 = 1;
}
segtree[pos].l1 = 0;
segtree[pos].chl1 = 0;
}
return;
}
void update0(long long lo, long long hi, node *segtree, long long pos, long long qlo, long long qhi, long long x)
{
pro0(lo, hi, segtree, pos);
pro1(lo, hi, segtree, pos);
if(qlo <= lo && qhi >= hi)
{
segtree[pos].l0 = x;
segtree[pos].chl0 = 1;
pro0(lo, hi, segtree, pos);
return;
}
if(qlo > hi || qhi < lo)
{
return;
}
long long mid = (lo + hi)/2;
update0(lo, mid, segtree, 2 * pos + 1, qlo, qhi, x);
update0(mid + 1, hi, segtree, 2 * pos + 2, qlo, qhi, x);
segtree[pos].ssum = segtree[2 * pos + 1].ssum + segtree[2 * pos + 2].ssum;
segtree[pos].sum = segtree[2 * pos + 1].sum + segtree[2 * pos + 2].sum;
}
void update1(long long lo, long long hi, node *segtree, long long pos, long long qlo, long long qhi, long long x)
{
pro0(lo, hi, segtree, pos);
pro1(lo, hi, segtree, pos);
if(qlo <= lo && qhi >= hi)
{
segtree[pos].l1 = x;
segtree[pos].chl1 = 1;
pro1(lo, hi, segtree, pos);
return;
}
if(qlo > hi || qhi < lo)
{
return;
}
long long mid = (lo + hi)/2;
update1(lo, mid, segtree, 2 * pos + 1, qlo, qhi, x);
update1(mid + 1, hi, segtree, 2 * pos + 2, qlo, qhi, x);
segtree[pos].ssum = segtree[2 * pos + 1].ssum + segtree[2 * pos + 2].ssum;
segtree[pos].sum = segtree[2 * pos + 1].sum + segtree[2 * pos + 2].sum;
}
long long query(long long lo, long long hi, node *segtree, long long pos, long long qlo, long long qhi)
{
pro0(lo, hi, segtree, pos);
pro1(lo, hi, segtree, pos);
if(qlo <= lo && qhi >= hi)
{
return segtree[pos].ssum;
}
if(qlo > hi || qhi < lo)
{
return 0;
}
long long mid = (lo + hi)/2;
long long a = query(lo, mid, segtree, 2 * pos + 1, qlo, qhi);
long long b = query(mid + 1, hi, segtree, 2 * pos + 2, qlo, qhi);
return a + b;
}
int main()
{
//freopen("in.in", "r", stdin);
long long t, cs = 1;
cin >> t;
while(t--)
{
cout << "Case " << cs++ << ":" << endl;
long long n, q;
cin >> n >> q;
long long *ar = new long long[n];
for(long long i = 0 ; i < n ; i++)
{
cin >> ar[i];
}
node *segtree = new node [4 * n];
build(ar, 0, n - 1, segtree, 0);
while(q--)
{
long long c, st, end, x;
cin >> c;
if(c == 0)
{
cin >> st >> end >> x;
update0(0, n - 1, segtree, 0, st - 1, end - 1, x);
}
else if(c == 1)
{
cin >> st >> end >> x;
update1(0, n - 1, segtree, 0, st - 1, end - 1, x);
}
else
{
cin >> st >> end;
cout << query(0, n - 1, segtree, 0, st - 1, end - 1) << endl;
}
}
delete [] segtree;
delete [] ar;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBub2RlCnsKCWxvbmcgbG9uZyBzc3VtLCBzdW07Cglib29sIGNobDAsIGNobDE7Cglsb25nIGxvbmcgbDAsIGwxOwp9OwoKdm9pZCBidWlsZCAobG9uZyBsb25nICphciwgbG9uZyBsb25nIGxvLCBsb25nIGxvbmcgaGksIG5vZGUgKnNlZ3RyZWUsIGxvbmcgbG9uZyBwb3MpCnsKCWlmKGxvID09IGhpKQoJewoJCXNlZ3RyZWVbcG9zXS5zc3VtID0gYXJbbG9dICogYXJbbG9dOwoJCXNlZ3RyZWVbcG9zXS5zdW0gPSBhcltsb107CgkJCgkJc2VndHJlZVtwb3NdLmwwID0gMDsKCQlzZWd0cmVlW3Bvc10ubDEgPSAwOwoJCQoJCXNlZ3RyZWVbcG9zXS5jaGwwID0gMDsKCQlzZWd0cmVlW3Bvc10uY2hsMSA9IDA7CgkJCgkJcmV0dXJuOwoJfQoJCglsb25nIGxvbmcgbWlkID0gKGxvICsgaGkpLzI7CgkKCWJ1aWxkKGFyLCBsbywgbWlkLCBzZWd0cmVlLCAyICogcG9zICsgMSk7CglidWlsZChhciwgbWlkICsgMSwgaGksIHNlZ3RyZWUsIDIgKiBwb3MgKyAyKTsKCQoJc2VndHJlZVtwb3NdLnNzdW0gPSBzZWd0cmVlWzIgKiBwb3MgKyAxXS5zc3VtICsgc2VndHJlZVsyICogcG9zICsgMl0uc3N1bTsKCXNlZ3RyZWVbcG9zXS5zdW0gPSBzZWd0cmVlWzIgKiBwb3MgKyAxXS5zdW0gKyBzZWd0cmVlWzIgKiBwb3MgKyAyXS5zdW07CgkKCXNlZ3RyZWVbcG9zXS5sMCA9IDA7CglzZWd0cmVlW3Bvc10ubDEgPSAwOwoJCglzZWd0cmVlW3Bvc10uY2hsMCA9IDA7CglzZWd0cmVlW3Bvc10uY2hsMSA9IDA7Cn0KCnZvaWQgcHJvMChsb25nIGxvbmcgbG8sIGxvbmcgbG9uZyBoaSwgbm9kZSAqc2VndHJlZSwgbG9uZyBsb25nIHBvcykKewoJaWYoc2VndHJlZVtwb3NdLmNobDAgIT0gMCkKCXsKCQlzZWd0cmVlW3Bvc10uc3N1bSA9IHNlZ3RyZWVbcG9zXS5sMCAqIHNlZ3RyZWVbcG9zXS5sMCAqIChoaSAtIGxvICsgMSk7CgkJc2VndHJlZVtwb3NdLnN1bSA9IHNlZ3RyZWVbcG9zXS5sMCAqIChoaSAtIGxvICsgMSk7CgkJCgkJaWYobG8gIT0gaGkpCgkJewoJCQlzZWd0cmVlWzIgKiBwb3MgKyAxXS5sMCA9IHNlZ3RyZWVbcG9zXS5sMDsKCQkJc2VndHJlZVsyICogcG9zICsgMl0ubDAgPSBzZWd0cmVlW3Bvc10ubDA7CgkJCQoJCQlzZWd0cmVlWzIgKiBwb3MgKyAxXS5jaGwwID0gMTsKCQkJc2VndHJlZVsyICogcG9zICsgMl0uY2hsMCA9IDE7CgkJCQoJCQlzZWd0cmVlWzIgKiBwb3MgKyAxXS5jaGwxID0gMDsKCQkJc2VndHJlZVsyICogcG9zICsgMl0uY2hsMSA9IDA7CgkJfQoJCQoJCXNlZ3RyZWVbcG9zXS5sMCA9IDA7CgkJc2VndHJlZVtwb3NdLmwxID0gMDsKCQkKCQlzZWd0cmVlW3Bvc10uY2hsMCA9IDA7CgkJc2VndHJlZVtwb3NdLmNobDEgPSAwOwoJfQoJCglyZXR1cm47Cn0KCnZvaWQgcHJvMShsb25nIGxvbmcgbG8sIGxvbmcgbG9uZyBoaSwgbm9kZSAqc2VndHJlZSwgbG9uZyBsb25nIHBvcykKewoJaWYoc2VndHJlZVtwb3NdLmNobDEgIT0gMCkKCXsKCQlzZWd0cmVlW3Bvc10uc3N1bSArPSAoaGkgLSBsbyArIDEpICogc2VndHJlZVtwb3NdLmwxICogc2VndHJlZVtwb3NdLmwxICsgMiAqIHNlZ3RyZWVbcG9zXS5zdW0gKiBzZWd0cmVlW3Bvc10ubDE7CgkJc2VndHJlZVtwb3NdLnN1bSArPSAoaGkgLSBsbyArIDEpICogc2VndHJlZVtwb3NdLmwxOwoJCQoJCWlmKGxvICE9IGhpKQoJCXsKCQkJc2VndHJlZVsyICogcG9zICsgMV0ubDEgKz0gc2VndHJlZVtwb3NdLmwxOwoJCQlzZWd0cmVlWzIgKiBwb3MgKyAyXS5sMSArPSBzZWd0cmVlW3Bvc10ubDE7CgkJCQoJCQlzZWd0cmVlWzIgKiBwb3MgKyAxXS5jaGwxID0gMTsKCQkJc2VndHJlZVsyICogcG9zICsgMl0uY2hsMSA9IDE7CgkJfQoJCQoJCXNlZ3RyZWVbcG9zXS5sMSA9IDA7CgkJc2VndHJlZVtwb3NdLmNobDEgPSAwOwoJfQoJCglyZXR1cm47Cn0KCnZvaWQgdXBkYXRlMChsb25nIGxvbmcgbG8sIGxvbmcgbG9uZyBoaSwgbm9kZSAqc2VndHJlZSwgbG9uZyBsb25nIHBvcywgbG9uZyBsb25nIHFsbywgbG9uZyBsb25nIHFoaSwgbG9uZyBsb25nIHgpCnsKCXBybzAobG8sIGhpLCBzZWd0cmVlLCBwb3MpOwoJcHJvMShsbywgaGksIHNlZ3RyZWUsIHBvcyk7CgkKCWlmKHFsbyA8PSBsbyAmJiBxaGkgPj0gaGkpCgl7CgkJc2VndHJlZVtwb3NdLmwwID0geDsKCQlzZWd0cmVlW3Bvc10uY2hsMCA9IDE7CgkJCgkJcHJvMChsbywgaGksIHNlZ3RyZWUsIHBvcyk7CgkJCgkJcmV0dXJuOwoJfQoJCglpZihxbG8gPiBoaSB8fCBxaGkgPCBsbykKCXsKCQlyZXR1cm47Cgl9CgkKCWxvbmcgbG9uZyBtaWQgPSAobG8gKyBoaSkvMjsKCQoJdXBkYXRlMChsbywgbWlkLCBzZWd0cmVlLCAyICogcG9zICsgMSwgcWxvLCBxaGksIHgpOwoJdXBkYXRlMChtaWQgKyAxLCBoaSwgc2VndHJlZSwgMiAqIHBvcyArIDIsIHFsbywgcWhpLCB4KTsKCQoJc2VndHJlZVtwb3NdLnNzdW0gPSBzZWd0cmVlWzIgKiBwb3MgKyAxXS5zc3VtICsgc2VndHJlZVsyICogcG9zICsgMl0uc3N1bTsKCXNlZ3RyZWVbcG9zXS5zdW0gPSBzZWd0cmVlWzIgKiBwb3MgKyAxXS5zdW0gKyBzZWd0cmVlWzIgKiBwb3MgKyAyXS5zdW07Cn0KCnZvaWQgdXBkYXRlMShsb25nIGxvbmcgbG8sIGxvbmcgbG9uZyBoaSwgbm9kZSAqc2VndHJlZSwgbG9uZyBsb25nIHBvcywgbG9uZyBsb25nIHFsbywgbG9uZyBsb25nIHFoaSwgbG9uZyBsb25nIHgpCnsgIAoJcHJvMChsbywgaGksIHNlZ3RyZWUsIHBvcyk7Cglwcm8xKGxvLCBoaSwgc2VndHJlZSwgcG9zKTsKCQoJaWYocWxvIDw9IGxvICYmIHFoaSA+PSBoaSkKCXsKCQlzZWd0cmVlW3Bvc10ubDEgPSB4OwoJCXNlZ3RyZWVbcG9zXS5jaGwxID0gMTsKCQkKCQlwcm8xKGxvLCBoaSwgc2VndHJlZSwgcG9zKTsKCQkKCQlyZXR1cm47Cgl9CgkKCWlmKHFsbyA+IGhpIHx8IHFoaSA8IGxvKQoJewoJCXJldHVybjsKCX0KCQoJbG9uZyBsb25nIG1pZCA9IChsbyArIGhpKS8yOwoJCgl1cGRhdGUxKGxvLCBtaWQsIHNlZ3RyZWUsIDIgKiBwb3MgKyAxLCBxbG8sIHFoaSwgeCk7Cgl1cGRhdGUxKG1pZCArIDEsIGhpLCBzZWd0cmVlLCAyICogcG9zICsgMiwgcWxvLCBxaGksIHgpOwoJCglzZWd0cmVlW3Bvc10uc3N1bSA9IHNlZ3RyZWVbMiAqIHBvcyArIDFdLnNzdW0gKyBzZWd0cmVlWzIgKiBwb3MgKyAyXS5zc3VtOwoJc2VndHJlZVtwb3NdLnN1bSAgPSBzZWd0cmVlWzIgKiBwb3MgKyAxXS5zdW0gICsgc2VndHJlZVsyICogcG9zICsgMl0uc3VtOwp9Cgpsb25nIGxvbmcgcXVlcnkobG9uZyBsb25nIGxvLCBsb25nIGxvbmcgaGksIG5vZGUgKnNlZ3RyZWUsIGxvbmcgbG9uZyBwb3MsIGxvbmcgbG9uZyBxbG8sIGxvbmcgbG9uZyBxaGkpCnsKCXBybzAobG8sIGhpLCBzZWd0cmVlLCBwb3MpOwoJcHJvMShsbywgaGksIHNlZ3RyZWUsIHBvcyk7CgkKCWlmKHFsbyA8PSBsbyAmJiBxaGkgPj0gaGkpCgl7CgkJcmV0dXJuIHNlZ3RyZWVbcG9zXS5zc3VtOwoJfQoJCglpZihxbG8gPiBoaSB8fCBxaGkgPCBsbykKCXsKCQlyZXR1cm4gMDsKCX0KCQoJbG9uZyBsb25nIG1pZCA9IChsbyArIGhpKS8yOwoJCglsb25nIGxvbmcgYSA9IHF1ZXJ5KGxvLCBtaWQsIHNlZ3RyZWUsIDIgKiBwb3MgKyAxLCBxbG8sIHFoaSk7Cglsb25nIGxvbmcgYiA9IHF1ZXJ5KG1pZCArIDEsIGhpLCBzZWd0cmVlLCAyICogcG9zICsgMiwgcWxvLCBxaGkpOwoJCglyZXR1cm4gYSArIGI7Cn0KCmludCBtYWluKCkKewoJLy9mcmVvcGVuKCJpbi5pbiIsICJyIiwgc3RkaW4pOwoJCglsb25nIGxvbmcgdCwgY3MgPSAxOwoJY2luID4+IHQ7CgkKCXdoaWxlKHQtLSkKCXsKCQljb3V0IDw8ICJDYXNlICIgPDwgY3MrKyA8PCAiOiIgPDwgZW5kbDsKCQlsb25nIGxvbmcgbiwgcTsKCQljaW4gPj4gbiA+PiBxOwoJCQoJCWxvbmcgbG9uZyAqYXIgPSBuZXcgbG9uZyBsb25nW25dOwoJCQoJCWZvcihsb25nIGxvbmcgaSA9IDAgOyBpIDwgbiA7IGkrKykKCQl7CgkJCWNpbiA+PiBhcltpXTsKCQl9CgkJCgkJbm9kZSAqc2VndHJlZSA9IG5ldyBub2RlIFs0ICogbl07CgkJYnVpbGQoYXIsIDAsIG4gLSAxLCBzZWd0cmVlLCAwKTsKCQkKCQl3aGlsZShxLS0pCgkJewoJCQlsb25nIGxvbmcgYywgc3QsIGVuZCwgeDsKCQkJCgkJCWNpbiA+PiBjOwoJCQkKCQkJaWYoYyA9PSAwKQoJCQl7CgkJCQljaW4gPj4gc3QgPj4gZW5kID4+IHg7CgkJCQl1cGRhdGUwKDAsIG4gLSAxLCBzZWd0cmVlLCAwLCBzdCAtIDEsIGVuZCAtIDEsIHgpOwoJCQl9CgkJCQoJCQllbHNlIGlmKGMgPT0gMSkKCQkJewoJCQkJY2luID4+IHN0ID4+IGVuZCA+PiB4OwoJCQkJdXBkYXRlMSgwLCBuIC0gMSwgc2VndHJlZSwgMCwgc3QgLSAxLCBlbmQgLSAxLCB4KTsKCQkJfQoJCQkKCQkJZWxzZQoJCQl7CgkJCQljaW4gPj4gc3QgPj4gZW5kOwoJCQkJY291dCA8PCBxdWVyeSgwLCBuIC0gMSwgc2VndHJlZSwgMCwgc3QgLSAxLCBlbmQgLSAxKSA8PCBlbmRsOwoJCQl9CgkJfQoJCQogICAgICAgIAoJCQoJCWRlbGV0ZSBbXSBzZWd0cmVlOwoJCWRlbGV0ZSBbXSBhcjsKCX0JCn0K