您的位置:首页 > 其它

codevs 1081 线段树练习 2 区间更新 单点查询 无lazy

2016-07-21 13:55 411 查看
题目描述 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

题意: 中文题意

题解: 裸线段树 区间更新 单点查询 无lazy

//code by  drizzle
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#define ll __int64
#define PI acos(-1.0)
#define mod 1000000007
using namespace std;
struct node
{
int l,r,value;
}tree[400005];
void buildtree(int root,int left,int right)
{
tree[root].l=left;
tree[root].r=right;
if(left==right)
{
scanf("%d",&tree[root].value);
return ;
}
int mid=(left+right)>>1;
buildtree(root<<1,left,mid);
buildtree(root<<1|1,mid+1,right);
tree[root].value=tree[root<<1].value+tree[root<<1|1].value;
}
void updata(int c,int left,int right,int root)
{
if(tree[root].l==left&&tree[root].r==right&&left==right)
{
tree[root].value+=c;
return;
}
int mid=(tree[root].l+tree[root].r)>>1;
if(right<=mid)
updata(c,left,right,root<<1);
else
{
if(left>mid)
updata(c,left,right,root<<1|1);
else
{
updata(c,left,mid,root<<1);
updata(c,mid+1,right,root<<1|1);
}
}
tree[root].value=tree[root<<1].value+tree[root<<1|1].value;
}
int  query(int left ,int right,int root)
{
if(tree[root].l==left&&tree[root].r==right)
{
return tree[root].value;
}
int mid=(tree[root].l+tree[root].r)>>1;
if(right<=mid)
return query(left,right,root<<1);
else
{
if(left>mid)
return query(left,right,root<<1|1);
else
return query(left,mid,root<<1)+query(mid+1,right,root<<1|1);
}
}
int n;
int exm;
int q;
int flag;
int lll,rrr,add;
int cha;
int main()
{
while(scanf("%d",&n)!=EOF)
{
buildtree(1,1,n);
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
scanf("%d",&flag);
if(flag==1)
{
scanf("%d %d %d",&lll,&rrr,&add);
updata(add,lll,rrr,1);
}
if(flag==2)
{
scanf("%d",&cha);
printf("%d\n",query(cha,cha,1));
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: