洛谷线段树1

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>

#include <cstdio>

#include <fstream>

#include <algorithm>

#include <cmath>

#include <deque>

#include <vector>

#include <queue>

#include <string>

#include <cstring>

#include <map>

#include <stack>

#include <set>

using namespace std;

const int N=1e5+50;

long long int m,n,s,e;

long long int p[N];

struct date

{

long long int sum;

long long int l,r,add;

}tree[4*N];

void pushup(long long int u)

{

tree[u].sum=tree[u<<1].sum+tree[u<<1|1].sum;

}

void change(long long int u,long long int k)

{

tree[u].sum+=(tree[u].r-tree[u].l+1)*k;

tree[u].add+=k;

}

void pushdown(long long int u)

{

if(tree[u].add)

{

change(u<<1,tree[u].add);

change(u<<1|1,tree[u].add);

tree[u].add=0;

}

}

void build(long long int x,long long int l,long long int r)

{

tree[x].l=l,tree[x].r=r;

if(l==r)

{

tree[x].sum=p[l];

tree[x].add=0;

return;

}

long long int mid=l+r>>1;

build(x<<1,l,mid);

build(x<<1|1,mid+1,r);

pushup(x);

}

long long int query(long long int u,long long int l,long long int r)

{

if(tree[u].l>=l&&tree[u].r<=r)

return tree[u].sum;

long long int mid=tree[u].l+tree[u].r>>1;

pushdown(u);

long long int res=0;

if(mid>=l) res+=query(u<<1,l,r);

if(r>mid) res+=query(u<<1|1,l,r);

return res;

}

void modify(long long int u,long long int l,long long int r,long long int k)

{

if(tree[u].l>=l&&tree[u].r<=r)

{

change(u,k);

return;

}

long long int mid=tree[u].l+tree[u].r>>1;

pushdown(u);

if(l<=mid)

modify(u<<1,l,r,k);

if(r>mid)

modify(u<<1|1,l,r,k);

pushup(u);

}

int main()

{

long long int i,j;

cin>>n>>m;

for(i=1;i<=n;i++)

{

cin>>p[i];

}

build(1,1,n);

while(m--)

{

int z;

cin>>z;

if(z==1)

{

long long int w1,w2,w3;

cin>>w1>>w2>>w3;

modify(1,w1,w2,w3);

}

else if(z==2)

{

long long int w1,w2;

cin>>w1>>w2;

long long int t=query(1,w1,w2);

cout<<t<<'\n';

}

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值