树状数组 【模板2】洛谷 P3368

来源:互联网 发布:寻侠感官突破数据 编辑:程序博客网 时间:2024/06/03 22:56

树状数组 【模板2】洛谷 P3368

题目描述

如题,已知一个数列,你需要进行下面两种操作:

1.将某区间每一个数数加上x

2.求出某一个数的和

输入输出格式

输入格式:
第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。

第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。

接下来M行每行包含3或4个整数,表示一个操作,具体如下:

操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k

操作2: 格式:2 x 含义:输出第x个数的值

输出格式:
输出包含若干行整数,即为所有操作2的结果。

输入输出样例

输入样例#1:
5 5
1 5 4 2 3
1 2 4 2
2 3
1 1 5 -1
1 3 5 7
2 4
输出样例#1:
6
10
说明

时空限制:1000ms,128M

数据规模:

对于30%的数据:N<=8,M<=10

对于70%的数据:N<=10000,M<=10000

对于100%的数据:N<=500000,M<=500000

800+ms代码:

#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>using namespace std;int n,m,a[500011],b[500011],temp,sum,res,x,y,z;int lowbit(int x){    return x&(-x);//核心便是这句话 }void add(int x,int v)//添加 {    while (x<=n)    {        b[x]+=v;        x+=lowbit(x);    }    return;}int ask(int x)//查询 {    int sumb=0;    while (x>0)    {        sumb+=b[x];//从1到x合起来         x-=lowbit(x);    }    return sumb;//}int main(){    scanf("%d%d",&n,&m);    for (int i=1;i<=n;i++)    {        scanf("%d",&a[i]);//        add(i,a[i]);/*这句话加了就错了,因为a[i]只是留着不动,最后调用*/    }    for (int i=1;i<=m;i++)    {        scanf("%d",&temp);        if (temp==1)        {            scanf("%d%d%d",&x,&y,&z);            add(x,z);//差分思想             add(y+1,-z);//注意+1         }        else        {            scanf("%d",&x);            printf("%d\n",ask(x)+a[x]);//别忘了加a[x]         }    }    return 0;} 
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 问道技能学错了怎么办 3岁宝宝反复感冒怎么办 宝宝8个月流鼻涕怎么办 玄凤鹦鹉下蛋了怎么办 被冤家报复了该怎么办 现在13岁不上学怎么办 孩子高二了厌学怎么办 饿了怎么办by肉丁豆角 味精吃多了很渴怎么办 婴儿o型血黄疸高怎么办 老婆怀孕期间老公出轨怎么办 小孩又瘦又矮怎么办 8个月婴儿太瘦怎么办 太瘦了怎么办80多斤 led吊扇灯坏了怎么办 妹子内裤被看了怎么办 都已婚却相爱了怎么办 喝了很烫的水怎么办 金毛幼犬不吃狗粮怎么办 4孩子受凉了呕吐怎么办 尿多是什么原因造成的怎么办 5岁宝宝老尿床怎么办 五岁了还尿床怎么办 2岁宝宝晚上尿床怎么办 胃疼腹泻稀水怎么办 网购成瘾怎么办 知乎 军人被警察打了怎么办 对高院再审不服怎么办 对高院判决不服怎么办 白色砂锅烧黑了怎么办 手机被偷关机了怎么办 狗被眼镜蛇咬了怎么办 穿高跟鞋脚趾头长茧怎么办 穿皮鞋脚底板疼怎么办 鞋子穿了脚趾痛怎么办 脚被鞋子磨肿了怎么办 脚趾磨出茧子怎么办疼 脚掌长茧走路疼怎么办 脚底磨出茧子疼怎么办 手指上写字有茧怎么办 写字磨的茧子疼怎么办