#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAX = 1e6 + 5;
int n, m, arr[MAX], tree[MAX * 4], lazy[4 * MAX];
bool mark[4 * MAX];
void build(int node, int l, int r) {
if(l == r) {
tree[node] = arr[l];
return;
}
int m = (l + r) / 2;
build(2 * node, l, m);
build(2 * node + 1, m + 1, r);
tree[node] = tree[2 * node] + tree[2 * node + 1];
}
void relax(int node, int l, int r) {
tree[node] = lazy[node];
if(l != r) {
if((r - l + 1) % 2 == 0) {
lazy[2 * node] = (lazy[node] - (((r - l + 1) / 2) * ((r - l + 1) / 2))) / 2;
lazy[2 * node + 1] = (lazy[node] - (((r - l + 1) / 2) * ((r - l + 1) / 2))) / 2 + (((r - l + 1) / 2) * ((r - l + 1) / 2));
}
else {
}
}
lazy[node] = -1;
}
void update(int node, int l, int r, int ql, int qr) {
if(lazy[node] != -1) {
relax(node, l, r);
}
if(l > qr || r < ql) return;
if(ql <= l && r <= qr) {
int e = l - ql, f = r - ql + 1;
lazy[node] = f * (f + 1) - e * (e + 1) / 2;
relax(node, l, r);
return;
}
int m = (l + r) / 2;
update(2 * node, l, m, ql, qr, val);
update(2 * node + 1, m + 1, r, ql, qr, val);
tree[node] = tree[node * 2] + tree[node * 2 + 1];
}
int query(int node, int l, int r, int ql, int qr) {
if(lazy[node] != -1) {
relax(node, l, r);
}
if(l > qr || r < ql) return 0;
if(ql <= l && r <= qr) return tree[node];
int m = (l + r) / 2;
int a = query(2 * node, l, m, ql, qr);
int b = query(2 * node + 1, m + 1, r, ql, qr);
return a + b;
}
void solve() {
memset(lazy, -1, sizeof(lazy));
cin >> n >> m;
while(m--) {
char t;
int l, r, x;
cin >> t;
if(t == 'A') {
cin >> l >> r >> x;
update(1, 1, n, l, r, x);
}
else {
cin >> l >> r;
cout << query(1, 1, n, l, r) << endl;
}
}
//}
signed main() {
int t = 1;
//cin >> t;
while (t--) {
solve();
}
}