DZY Loves Colors线段树之区间更新
Description
DZY loves colors, and he enjoys painting.
On a colorful day, DZY gets a colorful ribbon, which consists of n units (they are numbered from 1 to n from left to right). The color of the i-th unit of the ribbon is i at first. It is colorful enough, but we still consider that the colorfulness of each unit is 0 at first.
DZY loves painting, we know. He takes up a paintbrush with color x and uses it to draw a line on the ribbon. In such a case some contiguous units are painted. Imagine that the color of unit i currently is y. When it is painted by this paintbrush, the color of the unit becomes x, and the colorfulness of the unit increases by |x - y|.
DZY wants to perform m operations, each operation can be one of the following:
- Paint all the units with numbers between l and r (both inclusive) with color x.
- Ask the sum of colorfulness of the units between l and r (both inclusive).
Can you help DZY?
Input
The first line contains two space-separated integers n, m (1 ≤ n, m ≤ 105).
Each of the next m lines begins with a integer type (1 ≤ type ≤ 2), which represents the type of this operation.
If type = 1, there will be 3 more integers l, r, x (1 ≤ l ≤ r ≤ n; 1 ≤ x ≤ 108) in this line, describing an operation 1.
If type = 2, there will be 2 more integers l, r (1 ≤ l ≤ r ≤ n) in this line, describing an operation 2.
Output
For each operation 2, print a line containing the answer — sum of colorfulness.
Sample Input
3 3
1 1 2 4
1 2 3 5
2 1 3
8
3 4
1 1 3 4
2 1 1
2 2 2
2 3 3
3
2
1
10 6
1 1 5 3
1 2 7 9
1 10 10 11
1 3 8 12
1 1 10 3
2 1 10
129
Hint
In the first sample, the color of each unit is initially [1, 2, 3], and the colorfulness is [0, 0, 0].
After the first operation, colors become [4, 4, 3], colorfulness become [3, 2, 0].
After the second operation, colors become [4, 5, 5], colorfulness become [3, 3, 2].
So the answer to the only operation of type 2 is 8.
#include <cstdio> #include <iostream> using namespace std; typedef long long LL; const int maxn = 100010; struct node{ int leftt,rightt,sum; LL f,lazy,add; }tree[maxn<<2]; void pushup(int root){ int rt=root<<1; tree[root].f=tree[rt].f+tree[rt|1].f; if(tree[rt].sum == tree[rt|1].sum){ tree[root].sum = tree[rt].sum; }else{ tree[root].sum = 0; } } void pushdown(int root){ int rt=root<<1; if(tree[root].add) { tree[rt].add+=tree[root].add; tree[rt|1].add+=tree[root].add; tree[rt].f+=tree[root].add*tree[rt].lazy; tree[rt|1].f+=tree[root].add*tree[rt|1].lazy; tree[root].add=0; } if(tree[root].sum){ tree[rt].sum=tree[rt|1].sum=tree[root].sum; tree[root].sum = 0; } } void build(int leftt,int rightt,int root){ tree[root].leftt=leftt; tree[root].rightt=rightt; tree[root].lazy=rightt-leftt+1; tree[root].add=0; tree[root].f=0; if(leftt==rightt){ tree[root].sum=leftt; return; } int mid=(leftt+rightt)>>1; int rt=root<<1; build(leftt,mid,rt); build(mid+1,rightt,rt|1); pushup(root); } void update(int leftt,int rightt,int sum,int root){ if(leftt<=tree[root].leftt&&rightt>=tree[root].rightt&&tree[root].sum){ tree[root].add+=abs(tree[root].sum-sum); tree[root].f+=abs(tree[root].sum-sum)*tree[root].lazy; tree[root].sum=sum; return; } pushdown(root); int rt=root<<1; if(leftt<=tree[rt].rightt){ update(leftt,rightt,sum,rt); } if(rightt>=tree[rt|1].leftt){ update(leftt,rightt,sum,rt|1); } pushup(root); } LL query(int leftt,int rightt,int root){ if(leftt<=tree[root].leftt&&rightt>=tree[root].rightt){ return tree[root].f; } pushdown(root); LL ans=0; int rt=root<<1; if(leftt<=tree[root<<1].rightt){ ans+=query(leftt,rightt,rt); } if(rightt>=tree[rt|1].leftt){ ans+=query(leftt,rightt,rt|1); } pushup(root); return ans; } int main(){ int n,m,op,x,y,sum; scanf("%d%d",&n,&m); build(1,n,1); while(m--){ scanf("%d%d%d",&op,&x,&y); if(op == 1){ scanf("%d",&sum); update(x,y,sum,1); }else{ printf("%I64d\n",query(x,y,1)); } } return 0; }

浙公网安备 33010602011771号