您的位置:首页 > 其它

codevs 1081 线段树练习 2

2016-03-25 09:17 363 查看

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

代码一:

#include<cstdio>
#include<iostream>
using namespace std;
#define INF 100001
int sz[INF];
struct node {
int l,r,delta;
node *child[2];
int val;
}*root=NULL;
int n,q,a,b,c,x;
void input()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&sz[i]);
}
void update(node *cur)
{
cur->val=cur->child[0]->val+cur->child[1]->val;
}
void bulid(node *&cur,int l,int r)
{
if(l>r) return ;
cur=new node;
cur->l=l;cur->r=r;
cur->delta=0;
if(l==r)
{
cur->child[0]=cur->child[1]=NULL;
cur->val=sz[l];
}
else {
int mid=(l+r)/2;
bulid(cur->child[0],l,mid);
bulid(cur->child[1],mid+1,r);
//    update(cur);
}
}
void down(node * cur)
{
if(cur->child[0])
{
cur->child[0]->delta+=cur->delta;
cur->child[0]->val+=cur->delta*(cur->child[0]->r-cur->child[0]->l+1);
}
if(cur->child[1])
{
cur->child[1]->delta+=cur->delta;
cur->child[1]->val+=cur->delta*(cur->child[1]->r-cur->child[1]->l+1);
}
cur->delta=0;
}
void add(node* cur,int l,int r,int delta)
{
if(cur->l>=l&&cur->r<=r)
{
cur->delta+=delta;
cur->val+=delta*(cur->l-cur->r+1);
return ;
}
int mid=(cur->l+cur->r)/2;
if(cur->delta) down(cur);
if(l<=mid) add(cur->child[0],l,r,delta);
if(r>mid) add(cur->child[1],l,r,delta);
}
int query(node* cur,int x)
{
if(cur->l==cur->r)
{
return cur->val;
}
if(cur->delta) down(cur);
int mid=(cur->l+cur->r)/2;
if(x<=mid) return query(cur->child[0],x);
else return query(cur->child[1],x);
}
int main()
{
input();
bulid(root,1,n);
scanf("%d",&q);
while(q--)
{
scanf("%d",&x);
if(x==1){
scanf("%d%d%d",&a,&b,&c);
add(root,a,b,c);
}
else {
scanf("%d",&a);
printf("%d\n",query(root,a));
}
}
return 0;
}


mine
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: