本地样例过了,但全WA
/*
金陵城上西楼,倚清秋。万里夕阳垂地大江流。
中原乱,簪缨散,几时收?试倩悲风吹泪过扬州。
——朱敦儒《相见欢》
*/
//红太阳zhoukangyang txdy!
//Orz _ZMF_ yyds!
//Orz zzd yyds!
//Orz hehezhou AKNOI!
//stO dead_X && DXqwq Orz
//jimmywang && the_tool_er AKIOI
#include <bits/stdc++.h>
#define forq(i,a,b) for(int i=(a);i<=(b);i++)
#define fornq(i,a,b) for(int i=(a);i<(b);i++)
#define nforq(i,a,b) for(int i=(a);i>=(b);i--)
#define nfornq(i,a,b) for(int i=(a);i>(b);i--)
using namespace std;
class reader {
public:
reader& operator >> (int &t) {
int f = 1, num = 0;
char ch = getchar ();
while (!isdigit (ch)) {
if (ch == '-') f *= -1;
ch = getchar ();
}
while (isdigit (ch)) {
num = num * 10 + ch - '0';
ch = getchar ();
}
t = f * num;
return *this;
}
reader& operator >> (long long &t) {
long long f = 1, num = 0;
char ch = getchar ();
while (!isdigit (ch)) {
if (ch == '-') f *= -1;
ch = getchar ();
}
while (isdigit (ch)) {
num = num * 10 + ch - '0';
ch = getchar ();
}
t = f * num;
return *this;
}
reader& operator >> (unsigned int &t) {
unsigned int num = 0;
char ch = getchar ();
while (!isdigit (ch)) ch = getchar ();
while (isdigit (ch)) {
num = num * 10 + ch - '0';
ch = getchar ();
}
t = num;
return *this;
}
reader& operator >> (unsigned long long &t) {
unsigned int num = 0;
char ch = getchar ();
while (!isdigit (ch)) ch = getchar ();
while (isdigit (ch)) {
num = num * 10 + ch - '0';
ch = getchar ();
}
t = num;
return *this;
}
reader& operator >> (float &t);
reader& operator >> (double &t);
reader& operator >> (char &c);
reader& operator >> (char *s);
reader& operator >> (string &s);
reader& operator >> (__int128 &t);
} lin;
class writer {
private:
void writeu (unsigned int t) {
if (t > 9) writeu (t / 10);
putchar (t % 10 + '0');
}
void writeull (unsigned long long t) {
if (t > 9) writeull (t / 10);
putchar (t % 10 + '0');
}
public:
writer& operator << (int t) {
if (t < 0) putchar ('-'), t = -t;
writeu (t);
return *this;
}
writer& operator << (long long t) {
if (t < 0) putchar ('-'), t = -t;
writeull (t);
return *this;
}
writer& operator << (unsigned int t) {
writeu (t);
return *this;
}
writer& operator << (unsigned long long t) {
writeull (t);
return *this;
}
writer& operator << (float t);
writer& operator << (double t);
writer& operator << (char c) {
putchar (c);
return *this;
}
writer& operator << (char *s);
writer& operator << (string s);
writer& operator << (__int128 t);
} lout;
#define lend '\n'
#define int long long
const int maxn = 100100;
int n, m, tree[maxn << 2], lazy[maxn << 2];
int a[maxn];
#define mid ((l + r) >> 1)
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
void push_up (int rt) {tree[rt] = tree[rt << 1] + tree[rt << 1 | 1];}
void push_down (int l, int r, int rt) {
if (l != r) {
lazy[rt << 1] += lazy[rt];
lazy[rt << 1 | 1] += lazy[rt];
tree[rt << 1] += lazy[rt] * (mid - l + 1);
tree[rt << 1 | 1] += lazy[rt] * (r - mid);
}
lazy[rt] = 0;
}
void build (int l, int r, int rt) {
if (l == r) tree[rt] = a[l] - a[l - 1];
else {
build (lson);
build (rson);
push_up (rt);
}
}
void update (int L, int R, int l, int r, int rt, int x) {
if (L <= l && r <= R) {
tree[rt] += (r - l + 1) * x;
lazy[rt] += x;
} else {
push_down (l, r, rt);
if (L <= mid) update (L, R, lson, x);
if (R > mid) update (L, R, rson, x);
push_up (rt);
}
}
int query (int L, int R, int l, int r, int rt) {
if (L <= l && r <= R) return tree[rt];
push_down (l, r, rt);
int sum = 0;
if (L <= mid) sum += query (L, R, lson);
if (R > mid) sum += query (L, r, rson);
return sum;
}
signed main () {
lin >> n >> m;
forq (i, 1, n) lin >> a[i];
build (1, n, 1);
while (m--) {
int op;
lin >> op;
if (op == 1) {
int l, r, a, d;
lin >> l >> r >> a >> d;
if (l > r) swap (l, r);
update (l, l, 1, n, 1, a);
if (l != r) update (l + 1, r, 1, n, 1, d);
if (r != n) update (r + 1, r + 1, 1, n, 1, -(a + (r - l) * d));
} else {
int p;
lin >> p;
lout << query (1, p, 1, n, 1) << lend;
}
}
return 0;
}