A Simple Problem with Integers POJ

来源:互联网 发布:ff14国际服数据库app 编辑:程序博客网 时间:2024/06/02 23:08
You have N integers, A1, A2, ... , 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 A1, A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.Each of the next Q lines represents an operation."C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000."Q a b" means querying the sum of Aa, Aa+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.
题意:对这样一组数进行下列操作: Q操作表示读取该区间上的和,C操作表示为i到j区间的数全部增加c。

#include<stdio.h>#include<string.h>#include<stdalign.h>int num[400000];struct node{    int l,r;    long long nsum;    long long add;}seg[400000];void Build(int i,int l,int r)//建立线段树{    seg[i].l=l;    seg[i].r=r;    seg[i].add=0;    if(l==r)    {        seg[i].nsum = num[l];        return ;    }    int mid = (l+r)/2;    Build(i*2,l,mid);    Build(i*2+1,mid+1,r);    seg[i].nsum = seg[i*2].nsum+seg[i*2+1].nsum;}void Add(int i,int l,int r,long long c)//区间上的每个数增加{    if(seg[i].l==l&&seg[i].r==r)    {        seg[i].add+=c;        return ;    }    seg[i].nsum += c*(r-l+1);//这个区间总共增加了这些    int mid = (seg[i].l+seg[i].r)/2;    if(r<=mid)    Add(i*2,l,r,c);    else if(l>mid)    Add(i*2+1,l,r,c);    else    {        Add(i*2,l,mid,c);        Add(i*2+1,mid+1,r,c);    }}long long Query(int i,int a,int b)//查询a-b的总和{    if(seg[i].l==a&&seg[i].r==b)    {        return seg[i].nsum+(b-a+1)*seg[i].add;    }    seg[i].nsum+=(seg[i].r-seg[i].l+1)*seg[i].add;    int mid=(seg[i].l+seg[i].r)/2;    Add(i*2,seg[i].l,mid,seg[i].add);    Add(i*2+1,mid+1,seg[i].r,seg[i].add);    seg[i].add=0;    if(b<=mid)    return Query(i*2,a,b);    else if(a>mid)    return Query(i*2+1,a,b);    else    return Query(i*2,a,mid)+Query(i*2+1,mid+1,b);}int main(){    int n,m,i;    int a,b,c;    char s[10];    while(~scanf("%d%d",&n,&m))    {        for(i=1;i<=n;i++)        {            scanf("%d",&num[i]);        }        Build(1,1,n);        for(i=0;i<m;i++)        {            scanf("%s",s);            if(s[0]=='C')            {                scanf("%d%d%d",&a,&b,&c);                Add(1,a,b,c);            }            else            {                scanf("%d%d",&a,&b);                printf("%lld\n",Query(1,a,b));            }        }    }    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 出水痘发烧39度怎么办 腰肌拉伤怎么办恢复快 过敏起大水泡了怎么办 身上长疱疹怎么办冶疗 刚怀孕长了疱疹怎么办 吃完饭恶心想吐怎么办 减肥药吃了心慌怎么办 吃多了恶心想吐怎么办 想吐怎么办最快最有效 想吐又吐不出来怎么办 3岁宝宝反胃呕吐怎么办 2岁宝宝反胃呕吐怎么办 突然恶心想吐是怎么办 孕4个月反胃呕吐怎么办 怀孕2月反应大怎么办 狗吐拉稀不吃饭怎么办 狗狗咳喘怎么办最有效 半永久纹眉失败怎么办 纹的眉毛太细了怎么办 眉毛颜色做深了怎么办 半永久眼线不掉怎么办 移植9天来月经怎么办 月经迟迟不来该怎么办 lol晋级赛输了怎么办 激素正常的多囊怎么办 右侧输卵管通而不畅怎么办 小该咳嗽老不好怎么办 孩子吓着了怎么办最快 2个月宝宝吓到了怎么办 3个月宝宝吓到了怎么办 宝宝吓着了发烧怎么办 好几个月不遗精怎么办 孕妇吃了黑橄榄怎么办 内膜4mm来月经了怎么办 吃了伟哥没效果怎么办 维a酸乳膏副作用怎么办 颈椎病引起的头晕恶心怎么办 经常头疼怎么办最快最有效 感昌了头晕乏力怎么办 来例假喝啤酒了怎么办 来月经喝啤酒了怎么办