hihocoder 1078 : 线段树的区间修改

来源:互联网 发布:淘宝商家从哪里进货 编辑:程序博客网 时间:2024/05/21 01:51
#include <bits/stdc++.h>using namespace std;typedef long long LL;#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define pushUp(rt) (sum[rt] = sum[rt<<1]+sum[rt<<1|1])#define pushDown(rt,m) if(lazy[rt]){sum[rt<<1] = (m-(m>>1))*lazy[rt];lazy[rt<<1] = lazy[rt];\    sum[rt<<1|1] = (m>>1)*lazy[rt];lazy[rt<<1|1] = lazy[rt];lazy[rt] = 0;}const int MAXN = 1e5+10;LL sum[MAXN<<2];int lazy[MAXN<<2];void build(int l, int r, int rt){    if(l == r)    {        scanf("%lld",&sum[rt]);        return;    }    int mid = (l+r) >> 1;    build(lson);    build(rson);    pushUp(rt);}void update(int l, int r, int rt, int L, int R, int val){    if(l >= L && r <= R)    {        sum[rt] = (r-l+1)*val;        lazy[rt] = val;        return;    }    pushDown(rt,r-l+1);    int mid = (l+r) >> 1;    if(R > mid) update(rson,L,R,val);    if(L <= mid) update(lson,L,R,val);    pushUp(rt);}LL query(int l, int r, int rt, int L, int R){    if(l >= L && r <= R)        return sum[rt];    pushDown(rt,r-l+1);    int mid = (l+r) >> 1;    LL ret = 0;    if(R > mid) ret += query(rson,L,R);    if(L <= mid) ret += query(lson,L,R);    return ret;}int main(){    int n,q,op,l,r,val;    while(scanf("%d",&n) != EOF)    {        memset(lazy,0,sizeof(lazy));        memset(sum,0,sizeof(sum));        build(1,n,1);        scanf("%d",&q);        while(q--)        {            scanf("%d %d %d",&op,&l,&r);            if(op == 1)            {                scanf("%d",&val);                update(1,n,1,l,r,val);            }            else                printf("%lld\n",query(1,n,1,l,r));        }    }    return 0;}
原创粉丝点击