DZY Loves Colors线段树之区间更新

 
Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u
Submit Status

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:

  1. Paint all the units with numbers between l and r (both inclusive) with color x.
  2. 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

Input
3 3
1 1 2 4
1 2 3 5
2 1 3
Output
8
Input
3 4
1 1 3 4
2 1 1
2 2 2
2 3 3
Output
3
2
1
Input
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
Output
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;
}

 

posted @ 2022-07-30 15:55  killjoyskr  阅读(29)  评论(0)    收藏  举报