国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

poj 3468 線段樹lazy

2019-11-10 20:35:05
字體:
來源:轉載
供稿:網友
題目:

A Simple PRoblem with Integers
Time Limit: 5000MS Memory Limit: 131072K
Total Submissions: 102981 Accepted: 32160
Case Time Limit: 2000MS

Description

You have N integers, A1A2, ... , AN. You need to deal with two kinds of Operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.

Input

The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.The second line contains N numbers, the initial values of A1A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.Each of the next Q lines represents an operation."C a b c" means adding c to each of AaAa+1, ... , Ab. -10000 ≤ c ≤ 10000."Q a b" means querying the sum of AaAa+1, ... , Ab.

Output

You need to answer all Q commands in order. One answer in a line.

Sample Input

10 51 2 3 4 5 6 7 8 9 10Q 4 4Q 1 10Q 2 4C 3 6 3Q 2 4

Sample Output

455915

Hint

The sums may exceed the range of 32-bit integers.

代碼:

pushdown的時候要向下累加。

#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<ctype.h>    //tower()#include<set>  #include<map>  #include<iomanip>// cout<<setprecision(1)<<fixed<<a;#include<vector>   #include<cmath>	#include<algorithm>#include<bitset>#include<limits.h>#include<stack>#include<queue>using namespace std;const __int64 maxn=100010;const __int64 inf=0x7fffffff;#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1__int64 add[maxn<<2];//維護當前lazy值 __int64 sum[maxn<<2];//線段樹維護當前區間和 void pushup(__int64 rt){//當前結點信息更新到父結點	sum[rt]=sum[rt<<1]+sum[rt<<1|1]; }void pushdown(__int64 rt,__int64 num){	if(add[rt]){		add[rt<<1]+=add[rt];				//+=  not  =		add[rt<<1|1]+=add[rt];		sum[rt<<1]+=add[rt]*(num-(num>>1));		sum[rt<<1|1]+=add[rt]*(num>>1);		add[rt]=0;	}}void build(__int64 l,__int64 r,__int64 rt){	add[rt]=0;	if(l==r){		scanf("%I64d",&sum[rt]);		return;	}	__int64 mid=(l+r)>>1;	build(lson);	build(rson);	pushup(rt);}void update(__int64 a,__int64 b,__int64 c,__int64 l,__int64 r,__int64 rt){	if(a<=l&&b>=r){		add[rt]+=c;				//+=  not  =		sum[rt]+=c*(r-l+1);		return;	}	pushdown(rt,r-l+1);	__int64 mid=(l+r)>>1;	if(a<=mid) update(a,b,c,lson);	if(b>mid) update(a,b,c,rson);	pushup(rt);}__int64 query(__int64 a,__int64 b,__int64 l,__int64 r,__int64 rt){	if(a<=l&&b>=r) return sum[rt];	pushdown(rt,r-l+1);	__int64 mid=(l+r)>>1;	__int64 s=0;	if(a<=mid) s+=query(a,b,lson);	if(b>mid) s+=query(a,b,rson);	return s;}int main(){//G++:5888K	2985MS    C++:5360K	2000MS    __int64 n,m,a,b,c;    char s[2];    while(scanf("%I64d%I64d",&n,&m)==2){    	memset(sum,0,sizeof(sum));        build(1,n,1);        while(m--){            scanf("%s",s);            if(s[0]=='Q'){//查詢                scanf("%I64d%I64d",&a,&b);                printf("%I64d/n",query(a,b,1,n,1));            }            else{//染色                 scanf("%I64d%I64d%I64d",&a,&b,&c);                update(a,b,c,1,n,1);            }        }    }    return 0;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 龙江县| 尤溪县| 株洲县| 馆陶县| 西乌珠穆沁旗| 慈利县| 高淳县| 宁津县| 岳普湖县| 莱西市| 宝丰县| 林州市| 界首市| 高要市| 南岸区| 铜梁县| 临邑县| 沙河市| 淮阳县| 上虞市| 迁安市| 古丈县| 巨鹿县| 蕉岭县| 前郭尔| 漯河市| 兴文县| 博客| 黑山县| 宁南县| 侯马市| 平度市| 宁安市| 新泰市| 孟州市| 乌拉特中旗| 望江县| 弥勒县| 呼伦贝尔市| 松潘县| 梁河县|