还是最基础的线段树噢 这次是区间修改
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lc p<<1,s,mid
#define rc p<<1|1,mid+1,e
#define mid (s+e)/2
using namespace std;
const int N = 100005;
int sum[4 * N], setv[4 * N];
void pushup(int p)
{
sum[p] = (sum[p << 1] + sum[p << 1 | 1]);
}
void pushdown(int p, int s, int e)
{
if(setv[p] == 0) return;
sum[p << 1] = (mid - s + 1) * setv[p];
sum[p << 1 | 1] = (e - mid) * setv[p];
setv[p << 1] = setv[p];
setv[p << 1 | 1] = setv[p];
setv[p] = 0;
}
void build(int p, int s, int e)
{
setv[p] = 0;
if(s == e) scanf("%d", &sum[p]);
else
{
build(lc);
build(rc);
pushup(p);
}
}
void update(int p, int s, int e, int l, int r, int v)
{
if(s >= l && e <= r)
{
setv[p] = v;
sum[p] = (e - s + 1) * v;
return;
}
pushdown(p, s, e);
if(r <= mid) update(lc, l, r, v);
else if(l > mid) update(rc, l, r, v);
else update(lc, l, mid, v), update(rc, mid + 1, r, v);
pushup(p);
}
int query(int p, int s, int e, int l, int r)
{
if(s >= l && e <= r) return sum[p];
pushdown(p, s, e);
if(r <= mid) return query(lc, l, r);
if(l > mid) return query(rc, l, r);
return query(lc, l, mid) + query(rc, mid + 1, r);
}
int main()
{
int n, m, a, b, c, op;
while(~scanf("%d", &n))
{
build(1, 1, n);
scanf("%d", &m);
while(m--)
{
scanf("%d", &op);
if(op)
{
scanf("%d%d%d", &a, &b, &c);
update(1, 1, n, a, b, c);
}
else
{
scanf("%d%d", &a, &b);
printf("%d\n", query(1, 1, n, a, b));
}
}
}
return 0;
}
#include<cstdio>
#incl