#include <bits/stdc++.h>
#define LL long long
#define lc(i) ((i) << 1)
#define rc(i) (((i) << 1) | 1)
using namespace std;
const int N = 1e5 + 10;
struct node {
LL sum = 0;
LL tag = -1;
} tree[N << 2];
inline void pushdown(LL i, LL tl, LL tmid, LL tr) {
if(tree[i].tag != -1 && tl != tr) {
tree[lc(i)].sum = tree[i].tag * (tmid - tl + 1);
tree[lc(i)].tag = tree[i].tag;
tree[rc(i)].sum = tree[i].tag * (tr - tmid);
tree[rc(i)].tag = tree[i].tag;
tree[i].tag = -1;
tree[i].sum = tree[lc(i)].sum + tree[rc(i)].sum;
}
}
inline void build(LL i, LL tl, LL tr) {
tree[i].sum = 0;
tree[i].tag = -1;
if(tl == tr) return ;
LL tmid = (tl + tr) >> 1;
build(lc(i), tl, tmid);
build(rc(i), tmid + 1, tr);
}
inline void update(LL i, LL tl, LL tr, LL l, LL r, LL v) {
if(tl > r || tr < l) return ;
if(tl >= l && tr <= r) {
tree[i].tag = v;
tree[i].sum = v * (tr - tl + 1);
return ;
}
LL tmid = (tl + tr) >> 1;
pushdown(i, tl, tmid, tr);
update(lc(i), tl, tmid, l, r, v);
update(rc(i), tmid + 1, tr, l, r, v);
tree[i].sum = tree[lc(i)].sum + tree[rc(i)].sum;
}
inline query(LL i, LL tl, LL tr, LL l, LL r) {
if(tl > r || tr < l) return 0;
if(tl >= l && tr <= r) return tree[i].sum;
LL tmid = (tl + tr) >> 1;
pushdown(i, tl, tmid, tr);
LL lv = query(lc(i), tl, tmid, l, r);
LL rv = query(rc(i), tmid + 1, tr, l, r);
return lv + rv;
}
int main() {
LL n, m; scanf("%lld%lld", &n, &m);
build(1, 1, n);
while(m--) {
LL op, l, r; LL v;
scanf("%lld%lld%lld", &op, &l, &r);
if(op == 1) {
scanf("%lld", &v);
update(1, 1, n, l + 1, r, v);
} else if(op == 2) {
LL ans = query(1, 1, n, l + 1, r);
printf("%lld\n", ans);
}
}
return 0;
}
玄关。蒟蒻不解,一直 wa 在 #27,求助。