#include <bits/stdc++.h>
#define int long long
#define N 100010
using namespace std ;
int n , m , a[N] ;
struct node {
int sum , tag1 , tag2 ;
}tree[N * 4];
int ls(int cur) {
return (cur << 1) ;
}
int rs(int cur) {
return (cur << 1) + 1 ;
}
void pushup(int cur) {
tree[cur].sum = tree[ls(cur)].sum + tree[rs(cur)].sum ;
}
void build(int cur , int l , int r) {
tree[cur].tag1 = tree[cur].tag2 = 0 ;
if(l == r) {
tree[cur].sum = a[l] ;
return ;
}
int mid = (l + r) / 2 ;
build(ls(cur) , l , mid) ;
build(rs(cur) , mid + 1 , r) ;
pushup(cur) ;
}
bool InRange(int L , int R , int l , int r) {
return (l <= L && R <= r) ;
}
bool OutOfRange(int L , int R , int l , int r) {
return (l > R || r < L) ;
}
int Sum(int a1 , int d , int len) {
int an = a1 + (len - 1) * d ;
return (a1 + an) * len / 2 ;
}
void maketag(int cur , int len , int x , int y) {
tree[cur].sum += Sum(x , y , len) ;
tree[cur].tag1 += x ;
tree[cur].tag2 += y ;
}
void pushdown(int cur , int l , int r) {
int mid = (l + r) / 2 ;
maketag(ls(cur) , mid - l + 1 , tree[cur].tag1 , tree[cur].tag2) ;
maketag(rs(cur) , r - mid , tree[cur].tag1 + (mid - l + 1) * tree[cur].tag2 , tree[cur].tag2) ;
tree[cur].tag1 = tree[cur].tag2 = 0 ;
}
int query(int cur , int L , int R , int l , int r) {
if(InRange(l , r , L , R)) {
return tree[cur].sum ;
}
if(OutOfRange(l , r , L , R)) {
return 0 ;
}
int mid = (l + r) / 2 ;
pushdown(cur , l , r) ;
return query(ls(cur) , L , R , l , mid) + query(rs(cur) , L , R , mid + 1 , r) ;
}
void update(int cur , int L , int R , int l , int r , int x , int y) {
if(InRange(l , r , L , R)) {
maketag(cur , r - l + 1 , x , y) ;
return ;
}
if(OutOfRange(l , r , L , R)) {
return ;
}
int mid = (l + r) / 2 ;
pushdown(cur , l , r) ;
update(ls(cur) , L , R , l , mid , x , y) ;
update(rs(cur) , L , R , mid + 1 , r , x + y * (mid - l + 1) , y) ;
pushup(cur) ;
}
signed main() {
scanf("%lld%lld" , &n , &m) ;
for(int i = 1 ; i <= n ; i++) {
scanf("%lld" , &a[i]) ;
}
build(1 , 1 , n) ;
while(m--) {
int op , l , r , k , d , p ;
scanf("%lld" , &op) ;
if(op == 1) {
scanf("%lld%lld%lld%lld" , &l , &r , &k , &d) ;
update(1 , l , r , 1 , n , k , d) ;
}
else {
scanf("%lld" , &p) ;
printf("%lld\n" , query(1 , p , p , 1 , n)) ;
}
}
return 0 ;
}
样例爆8求助,悬关