#include <bits/stdc++.h>
using namespace std;
const int N = 5e4 + 5;
int n, a[N], id[N], tag[N];
void update(int l, int r, int c) {
//1.在一块里
if (id[l] == id[r]) {
for (int i = l; i <= r; i++) {
a[i] += c;
}
} else {
//1.从l到l块的终点暴力+c
for (int i = l; id[i] == id[l]; i++) {
a[i] += c;
}
//2.从l+1块到r-1块直接修改标记
for (int i = id[l] + 1; i < id[r]; i++) {
tag[i] += c;
}
//3.从r块开始到r暴力+c
for (int i = r; id[i] == id[r]; i--) {
a[i] += c;
}
}
}
int query(int x) {
return a[x] + tag[id[x]];
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
int len = sqrt(n);
for (int i = 1; i <= n; i++) {
cin >> a[i];
id[i] = (i - 1) / len + 1;
}
for (int i = 1; i <= n; i++) {
int op, l, r, c;
cin >> op >> l >> r >> c;
if (op == 0) {
update(l, r, c);
} else {
cout << query(r) << '\n';
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 5e4 + 5;
int n, a[N], id[N], sum[N], Max[N], len;
void update(int l, int r) {
if (id[l] == id[r]) {
if (Max[id[l]] == 1 || Max[id[l]]==0)
return;
for (int i = l; i <= r; i++) {
if(a[i]!=0)
a[i] = sqrt(a[i]);
}
Max[id[l]] = 0;
sum[id[l]] = 0;
for (int i = (id[l] - 1) * len + 1; id[i] == id[l]; i++) {
Max[id[l]] = max(Max[id[l]], a[i]);
sum[id[l]] += a[i];
}
} else {
if (Max[id[l]] != 1) {
for (int i = l; id[i] == id[l]; i++) {
if(a[i])
a[i] = sqrt(a[i]);
}
sum[id[l]] = 0;
Max[id[l]] = 0;
for (int i = (id[l] - 1) * len + 1; id[i] == id[l]; i++) {
sum[id[l]] += a[i];
Max[id[l]] = max(Max[id[l]], a[i]);
}
}
for (int i = id[l] + 1; i < id[r]; i++) {
if (Max[i] == 1)
continue;
sum[i] = 0, Max[i] = 0;
for (int j = (i - 1) * len + 1; id[j] == i; j++) {
if(a[j])
a[j] = sqrt(a[j]);
sum[i] += a[j];
Max[i] = max(Max[i], a[j]);
}
}
if (Max[id[r]] != 1) {
for (int i = r; id[i] == id[r]; i--) {
if(a[i])
a[i] = sqrt(a[i]);
}
sum[id[r]] = 0;
Max[id[r]] = 0;
for (int i = (id[r] - 1) * len + 1; id[i] == id[r]; i++) {
sum[id[r]] += a[i];
Max[id[r]] = max(Max[id[r]], a[i]);
}
}
}
}
int query(int l, int r) {
if (id[l] == id[r]) {
int res = 0;
for (int i = l; i <= r; i++) {
res += a[i];
}
return res;
} else {
int res = 0;
for (int i = l; id[i] == id[l]; i++)
res += a[i];
for (int i = id[l] + 1; i < id[r]; i++)
res += sum[i];
for (int i = r; id[i] == id[r]; i--)
res += a[i];
return res;
}
}
int main() {
cin >> n;
len = sqrt(n);
for (int i = 1; i <= n; i++) {
cin >> a[i];
id[i] = (i - 1) /len + 1;
sum[id[i]] += a[i];
Max[id[i]] = max(Max[id[i]], a[i]);
}
for (int i = 1; i <= n; i++) {
int op, l, r, c;
cin >> op >> l >> r >> c;
if (op == 0) {
update(l, r);
} else
cout << query(l, r) << endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, a[N], id[N], siz[N], len, tot;
vector<int>b[N];
void update(int l, int r) {
for (int i = 1; i <= tot; i++) {
if (l > siz[i]) {
l -= siz[i];
} else {
b[i].insert(b[i].begin() + l - 1, r);
siz[i]++;
break;
}
}
}
int query(int x) {
for (int i = 1; i <= tot; i++) {
if (x > siz[i]) {
// cout << x << " " << i << " " << siz[i] << endl;
x -= siz[i];
} else {
return b[i][x - 1];
}
}
}
int main() {
cin >> n;
len = sqrt(n);
for (int i = 1; i <= n; i++) {
cin >> a[i];
id[i] = (i - 1) / len + 1;
b[id[i]].push_back(a[i]);
siz[id[i]]++;
tot = max(tot, id[i]);
}
for (int i = 1; i <= n; i++) {
int op, l, r, c;
cin >> op >> l >> r >> c;
if (op == 0) {
update(l, r);
} else
cout << query(r) << endl;
}
return 0;
}