题目描述 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
#include<stdio.h> #include<string.h> #define MAX 100010 int data[MAX],ans; struct tree { int left,right,digit; }; tree segment_tree[4*MAX]; void build(int l,int r,int node) { segment_tree[node].left=l; segment_tree[node].right=r; segment_tree[node].digit=data[l]; if(l==r) return; int mid=(l+r)/2; build(l,mid,2*node+1); build(mid+1,r,2*node+2); } void insert(int l,int r,int update,int node) { if(segment_tree[node].left==segment_tree[node].right) { segment_tree[node].digit+=update; return; } if(segment_tree[node].left>r||segment_tree[node].right<l) return; insert(l,r,update,2*node+1); insert(l,r,update,2*node+2); } void query(int pos,int node) { if(segment_tree[node].left==segment_tree[node].right) { ans= segment_tree[node].digit; return; } int mid=(segment_tree[node].left+segment_tree[node].right)/2; if(pos<=mid) query(pos,2*node+1); else query(pos,2*node+2); } int main() { freopen("b.txt","r",stdin); int n,m,i,command,pos,update,l,r; while(scanf("%d",&n)==1) { for(i=1;i<=n;i++) scanf("%d",&data[i]); build(1,n,0); scanf("%d",&m); while(m--) { scanf("%d",&command); if(command==1) { scanf("%d %d %d",&l,&r,&update); insert(l,r,update,0); } else { scanf("%d",&pos); query(pos,0); printf("%d\n",ans); } } } return 0; }