#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define SIZE 100005
struct info
{
long long sum;
}tree[4*SIZE],Lazy[4*SIZE];
long long gcd(long long a, long long b)
{
if (a == 0)
return b;
return gcd(b%a, a);
}
void initCase()
{
for (int i = 0; i<SIZE; i++)
{
tree[i].sum = 0;
Lazy[i].sum = -1;
}
}
void lazyPropagate(int node, int qs, int qe)
{
if (qs != qe) //interval node
{
int left = node * 2;
int right = (node * 2) + 1;
Lazy[left].sum = Lazy[node].sum;
Lazy[right].sum = Lazy[node].sum;
}
tree[node].sum = (qe - qs + 1)*Lazy[node].sum;
Lazy[node].sum = -1;
}
void update(int node, int qs, int qe, int start, int end, long long value)
{
if (Lazy[node].sum != -1)
lazyPropagate(node, qs, qe);
if (qs > end || qe < start)
return;
else if (qs >= start && qe <= end)
{
tree[node].sum = (qe - qs + 1)*value; //
if (qs != qe)
{
int left = node * 2;
int right = (node * 2) + 1;
Lazy[left].sum = value;
Lazy[right].sum = value;
}
return;
}
int left = node * 2;
int right = (node * 2) + 1;
int mid = (qs + qe) / 2;
update(left, qs, mid, start, end, value);
update(right, mid + 1, qe, start, end, value);
tree[node].sum = tree[left].sum + tree[right].sum;
}
long long query(int node, int qs, int qe, int start, int end)
{
if (Lazy[node].sum != -1)
lazyPropagate(node, qs, qe);
if (qs > end || qe < start)
return 0;
else if (qs >= start && qe <= end)
{
return tree[node].sum;
}
int left = node * 2;
int right = (node * 2) + 1;
int mid = (qs + qe) / 2;
long long b1 = query(left, qs, mid, start, end);
long long b2 = query(right, mid + 1, qe, start, end);
return b1 + b2;
}
int main()
{
//freopen("inp.txt", "r", stdin);
int tc, cn = 1 , n, q, i, j, v, op;
scanf("%d", &tc);
while (tc--)
{
initCase();
scanf("%d %d", &n, &q);
printf("Case %d:\n", cn++);
for (int a = 1; a <= q; a++)
{
scanf("%d", &op);
if (op == 1)
{
scanf("%d %d %d", &i, &j, &v);
update(1, 1, n, i+1, j+1, v);
}
else if (op == 2)
{
scanf("%d %d", &i, &j);
long long res = query(1, 1, n, i + 1, j + 1);
long long totalNum = (j - i + 1);
if (res % totalNum == 0)
printf("%lld\n", res / totalNum);
else
{
//printf("Res: %d\n", res);
long long numerator = res / gcd(res, totalNum);
long long denominator = totalNum / gcd(res, totalNum);
printf("%lld/%lld\n", numerator, denominator);
}
}
}
}
return 0;
}
I2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwojaW5jbHVkZTxzdGRpby5oPgojZGVmaW5lIFNJWkUgMTAwMDA1CgoKc3RydWN0IGluZm8KewoJbG9uZyBsb25nIHN1bTsKfXRyZWVbNCpTSVpFXSxMYXp5WzQqU0laRV07Cgpsb25nIGxvbmcgZ2NkKGxvbmcgbG9uZyBhLCBsb25nIGxvbmcgYikKewoJaWYgKGEgPT0gMCkKCQlyZXR1cm4gYjsKCglyZXR1cm4gZ2NkKGIlYSwgYSk7Cn0KCnZvaWQgaW5pdENhc2UoKQp7CgkKCWZvciAoaW50IGkgPSAwOyBpPFNJWkU7IGkrKykKCXsKCQl0cmVlW2ldLnN1bSA9IDA7CgkJTGF6eVtpXS5zdW0gPSAtMTsKCX0KfQoKdm9pZCBsYXp5UHJvcGFnYXRlKGludCBub2RlLCBpbnQgcXMsIGludCBxZSkKewoJCglpZiAocXMgIT0gcWUpIC8vaW50ZXJ2YWwgbm9kZQoJewoJCWludCBsZWZ0ID0gbm9kZSAqIDI7CgkJaW50IHJpZ2h0ID0gKG5vZGUgKiAyKSArIDE7CgkJTGF6eVtsZWZ0XS5zdW0gPSBMYXp5W25vZGVdLnN1bTsKCQlMYXp5W3JpZ2h0XS5zdW0gPSBMYXp5W25vZGVdLnN1bTsKCX0KCXRyZWVbbm9kZV0uc3VtID0gKHFlIC0gcXMgKyAxKSpMYXp5W25vZGVdLnN1bTsKCUxhenlbbm9kZV0uc3VtID0gLTE7Cn0KCnZvaWQgdXBkYXRlKGludCBub2RlLCBpbnQgcXMsIGludCBxZSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBsb25nIGxvbmcgdmFsdWUpCnsKCWlmIChMYXp5W25vZGVdLnN1bSAhPSAtMSkKCQlsYXp5UHJvcGFnYXRlKG5vZGUsIHFzLCBxZSk7CgoJaWYgKHFzID4gZW5kIHx8IHFlIDwgc3RhcnQpCgkJcmV0dXJuOwoKCWVsc2UgaWYgKHFzID49IHN0YXJ0ICYmIHFlIDw9IGVuZCkKCXsKCQl0cmVlW25vZGVdLnN1bSA9IChxZSAtIHFzICsgMSkqdmFsdWU7IC8vCgkJaWYgKHFzICE9IHFlKQoJCXsKCQkJaW50IGxlZnQgPSBub2RlICogMjsKCQkJaW50IHJpZ2h0ID0gKG5vZGUgKiAyKSArIDE7CgoJCQlMYXp5W2xlZnRdLnN1bSA9IHZhbHVlOwoJCQlMYXp5W3JpZ2h0XS5zdW0gPSB2YWx1ZTsKCQl9CgkJCgoJCXJldHVybjsKCX0KCglpbnQgbGVmdCA9IG5vZGUgKiAyOwoJaW50IHJpZ2h0ID0gKG5vZGUgKiAyKSArIDE7CglpbnQgbWlkID0gKHFzICsgcWUpIC8gMjsKCgl1cGRhdGUobGVmdCwgcXMsIG1pZCwgc3RhcnQsIGVuZCwgdmFsdWUpOwoJdXBkYXRlKHJpZ2h0LCBtaWQgKyAxLCBxZSwgc3RhcnQsIGVuZCwgdmFsdWUpOwoKCXRyZWVbbm9kZV0uc3VtID0gdHJlZVtsZWZ0XS5zdW0gKyB0cmVlW3JpZ2h0XS5zdW07Cn0KCmxvbmcgbG9uZyBxdWVyeShpbnQgbm9kZSwgaW50IHFzLCBpbnQgcWUsIGludCBzdGFydCwgaW50IGVuZCkKewoJaWYgKExhenlbbm9kZV0uc3VtICE9IC0xKQoJCWxhenlQcm9wYWdhdGUobm9kZSwgcXMsIHFlKTsKCglpZiAocXMgPiBlbmQgfHwgcWUgPCBzdGFydCkKCQlyZXR1cm4gMDsKCgllbHNlIGlmIChxcyA+PSBzdGFydCAmJiBxZSA8PSBlbmQpCgl7CgkJcmV0dXJuIHRyZWVbbm9kZV0uc3VtOwoJfQoKCWludCBsZWZ0ID0gbm9kZSAqIDI7CglpbnQgcmlnaHQgPSAobm9kZSAqIDIpICsgMTsKCWludCBtaWQgPSAocXMgKyBxZSkgLyAyOwoKCQoJbG9uZyBsb25nIGIxID0gcXVlcnkobGVmdCwgcXMsIG1pZCwgc3RhcnQsIGVuZCk7Cglsb25nIGxvbmcgYjIgPSBxdWVyeShyaWdodCwgbWlkICsgMSwgcWUsIHN0YXJ0LCBlbmQpOwoKCXJldHVybiBiMSArIGIyOwp9CgppbnQgbWFpbigpCnsKCS8vZnJlb3BlbigiaW5wLnR4dCIsICJyIiwgc3RkaW4pOwoJaW50IHRjLCBjbiA9IDEgLCBuLCBxLCBpLCBqLCB2LCBvcDsKCXNjYW5mKCIlZCIsICZ0Yyk7Cgl3aGlsZSAodGMtLSkKCXsKCQlpbml0Q2FzZSgpOwoJCXNjYW5mKCIlZCAlZCIsICZuLCAmcSk7CgkJcHJpbnRmKCJDYXNlICVkOlxuIiwgY24rKyk7CgkJZm9yIChpbnQgYSA9IDE7IGEgPD0gcTsgYSsrKQoJCXsKCQkJc2NhbmYoIiVkIiwgJm9wKTsKCQkJaWYgKG9wID09IDEpCgkJCXsKCQkJCXNjYW5mKCIlZCAlZCAlZCIsICZpLCAmaiwgJnYpOwoJCQkJdXBkYXRlKDEsIDEsIG4sIGkrMSwgaisxLCB2KTsKCQkJfQoJCQllbHNlIGlmIChvcCA9PSAyKQoJCQl7CgkJCQlzY2FuZigiJWQgJWQiLCAmaSwgJmopOwoJCQkJbG9uZyBsb25nIHJlcyA9IHF1ZXJ5KDEsIDEsIG4sIGkgKyAxLCBqICsgMSk7CgkJCQlsb25nIGxvbmcgdG90YWxOdW0gPSAoaiAtIGkgKyAxKTsKCQkJCQoJCQkJCWlmIChyZXMgJSB0b3RhbE51bSA9PSAwKQoJCQkJCXByaW50ZigiJWxsZFxuIiwgcmVzIC8gdG90YWxOdW0pOwoJCQkJZWxzZQoJCQkJewoJCQkJCS8vcHJpbnRmKCJSZXM6ICVkXG4iLCByZXMpOwoJCQkJCWxvbmcgbG9uZyAgbnVtZXJhdG9yID0gcmVzIC8gZ2NkKHJlcywgdG90YWxOdW0pOwoJCQkJCWxvbmcgbG9uZyBkZW5vbWluYXRvciA9IHRvdGFsTnVtIC8gZ2NkKHJlcywgdG90YWxOdW0pOwoJCQkJCXByaW50ZigiJWxsZC8lbGxkXG4iLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKCQkJCX0KCQkJCQkKCQkJfQoJCX0KCX0KCglyZXR1cm4gMDsKfQ==