Question link: Click the open link
Water ..
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <math.h>#include <set>#include <vector>#include <map>using namespace std;#define ll long long#define L(x) (x<<1)#define R(x) (x<<1|1)#define N 100005inline int Mid(int a,int b){return (a+b)>>1;}inline ll ABS(ll x){return x>0?x:-x;}int n,m;struct node{ int l, r, id; ll siz(){return (ll)(r-l+1);} ll sum, col, lazy, same;}tree[N<<2];void push_down(int id){ if(tree[id].l==tree[id].r)return ; if(tree[id].lazy) { tree[L(id)].sum += tree[L(id)].siz()*tree[id].lazy; tree[R(id)].sum += tree[R(id)].siz()*tree[id].lazy; tree[L(id)].lazy += tree[id].lazy; tree[R(id)].lazy += tree[id].lazy; tree[id].lazy = 0; } if(tree[id].col>=0){ tree[L(id)].col = tree[R(id)].col = tree[id].col; }}void push_up(int id){ if(tree[L(id)].col==tree[R(id)].col&&tree[L(id)].col>=0) tree[id].col = tree[L(id)].col, tree[id].same = 1; else tree[id].col = -1, tree[id].same = 0; tree[id].sum = tree[L(id)].sum+tree[R(id)].sum;}void build(int l, int r, int id){ tree[id].l = l, tree[id].r = r; tree[id].sum = 0; tree[id].lazy = 0; tree[id].col = -1; tree[id].same = 0; if(l==r){ tree[id].col = l; tree[id].same = 1; return ; } int mid = Mid(l,r); build(l,mid,L(id)); build(mid+1,r,R(id));}void updata(int l, int r, int id, ll col){ push_down(id); if(l==tree[id].l&&tree[id].r==r && tree[id].same){ tree[id].sum += tree[id].siz() * ABS(col-tree[id].col); tree[id].lazy += ABS(col-tree[id].col); tree[id].col = col; return ; } int mid = Mid(tree[id].l, tree[id].r); if(mid<l) updata(l,r,R(id),col); else if(r<=mid) updata(l,r,L(id),col); else { updata(l,mid,L(id),col); updata(mid+1,r,R(id),col); } push_up(id);}ll query(int l, int r, int id){ push_down(id); if(l==tree[id].l && tree[id].r==r) return tree[id].sum; int mid = Mid(tree[id].l, tree[id].r); if(mid<l) return query(l,r,R(id)); else if(r<=mid) return query(l,r,L(id)); else return query(l,mid,L(id))+query(mid+1,r,R(id));}int main(){ int type, l, r; ll x; while(~scanf("%d %d",&n,&m)){ build(1,n,1); while(m--){ scanf("%d %d %d",&type,&l,&r); if(type==1){ scanf("%I64d",&x); updata(l,r,1,x); } else { printf("%I64d\n",query(l,r,1)); } } } return 0;}