线段树练习2

摘要:
1081线段树练习2时间限制:1s空间限制:128000KB题目等级:大师Master题目描述Description给你N个数,有两种操作1:给区间[a,b]的所有数都增加X2:询问第i个数是什么?如果第一个数是1,后接3个正整数a,b,X,表示在区间[a,b]内每个数增加X,如果是2,后面跟1个整数i,表示询问第i个位置的数是多少。

1081 线段树练习 2

时间限制: 1 s
空间限制: 128000 KB
题目等级 : 大师 Master
题目描述 Description

给你N个数,有两种操作

1:给区间[a,b]的所有数都增加X

2:询问第i个数是什么?

输入描述 Input Description

第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,表示操作的个数. 接下来Q行每行若干个整数。如果第一个数是1,后接3个正整数a,b,X,表示在区间[a,b]内每个数增加X,如果是2,后面跟1个整数i, 表示询问第i个位置的数是多少。

输出描述 Output Description

对于每个询问输出一行一个答案

样例输入 Sample Input

3

1

2

3

2

1 2 3 2

2 3

样例输出 Sample Output

5

数据范围及提示 Data Size & Hint

数据范围

1<=n<=100000

1<=q<=100000

1 #include<iostream>
2 #include<cstdio>
3 
4 using namespacestd;
5 const int N=100001;
6 
7 intans,n,m,z,x,y,yj;
8 
9 structnode{
10     intl,r,w,f;
11 }T[N*4];
12 
13 void down(intjd)
14 {
15     T[jd<<1].w+=T[jd].f*(T[jd<<1].r-T[jd<<1].l+1);
16     T[jd<<1|1].w+=T[jd].f*(T[jd<<1|1].r-T[jd<<1|1].l+1);
17     T[jd<<1].f+=T[jd].f;
18     T[jd<<1|1].f+=T[jd].f;
19     T[jd].f=0;
20 }
21 
22 void built(int l,int r,intjd)
23 {
24     T[jd].l=l;
25     T[jd].r=r;
26     if(T[jd].l==T[jd].r)
27 {
28         cin>>T[jd].w;
29         return;
30 }
31     int mid=(l+r)>>1;
32     built(l,mid,jd<<1);
33     built(mid+1,r,jd<<1|1);
34     T[jd].w=T[jd<<1].w+T[jd<<1|1].w;
35 }
36 
37 void qj_gai(intjd)
38 {
39     if(x<=T[jd].l&&T[jd].r<=y)
40 {
41         T[jd].w+=(T[jd].r-T[jd].l+1)*yj;//xiang zheng jia shang le ji ge yj bian liang 
42         T[jd].f+=yj;
43         return;
44 }
45     if(T[jd].f)down(jd);
46     int mid=(T[jd].l+T[jd].r)>>1;
47     if(x<=mid)qj_gai(jd<<1);
48     if(y>mid)qj_gai(jd<<1|1);
49     T[jd].w=T[jd<<1].w+T[jd<<1|1].w; 
50 }
51 
52 void po_ask(intjd)
53 {
54     if(T[jd].l==T[jd].r)
55 {
56         ans=T[jd].w;
57         return;
58 }
59     if(T[jd].f)down(jd);
60     int mid=(T[jd].l+T[jd].r)>>1;
61     if(x<=mid)po_ask(jd<<1);
62     else po_ask(jd<<1|1);
63 }
64 
65 intmain()
66 {
67     cin>>n;
68     built(1,n,1);    
69     cin>>m;
70     for(int i=1;i<=m;i++)
71 {
72         cin>>z;
73         if(z==1)
74 {
75             cin>>x>>y>>yj;
76             qj_gai(1);
77 }
78         if(z==2)
79 {
80             cin>>x;
81             po_ask(1);
82             cout<<ans<<endl;
83 }
84 }
85     return 0;
86 }

免责声明:文章转载自《线段树练习2》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇网络安全开发包介绍Liferay7 BPM门户开发之1:Liferay7开发环境准备下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

RF(一)RF的安装步骤

7.安装Appium 8,安装最新版本的nodeJS:node-v6.9.49,在命令行上执行Appium命令,您应该能够启动Appium服务器~~~~...

git:将两个请求合并为一个请求

Gitrebase ihEAD~2解释:此命令可以以文本形式显示您提交的两次请求。如果数字2被4替换,则您最近四次提交的信息将显示如下:1 pick56a06efchange1:删除一个空白行2 pickedbeab5change2:addlogonMainActivity34#Rebase23198ba..Edbeab5onto23198ba5#6#命令:...

C# 获取枚举 Enum 变量值的 Description 属性

如何在C#中读取枚举值的描述属性?有以下枚举:123456 public enum enum Langage{[System.ComponentModel.Description]Chinese,English}我们希望得到的是中文中的“Chinese”描述。123456789 publicstringGetEnumDescription{stringstr...

virtuoso数据库的安装方法

数据库虚拟师有两种安装和配置方法。第一种方法是默认情况下直接在系统中安装virtualoso,复制virtualoso的安装文件,然后默认情况下将其直接安装。使用命令行对virtualoso数据库进行操作。1将virtualoso opensource解压缩到指定目录。例如,c:virtualoso2安装VC++2012和VC++2010插件补丁3以设置环境...

可爱猫+python——定制化微信机器人

框架是模拟真实用户操作,只要不违法乱纪,是不用担心账号冻结问题的。...

win10 .net3.5的问题及解决方案

小编下面就介绍win1064位系统无法安装Netframework3.5的两种解决方案吧在Windows10中,当我们安装某些软件的时候会提示“你的电脑上的应用需要使用以下Windows功能:.NETFramework3.5”。但近日有网友反映在windows10_64位系统电脑上安装Netframework3.5,操作时总是遇到失败的情况。下面小编就为大家...