// Arbori_noduri_BST_Nebunii.cpp : This file contains the 'main' function. Program execution begins and ends there.
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("baruri.in");
ofstream fout("baruri.out");
int n, m;
int segTree[4 * 100001];
/*
void build(int ind, int st, int dr) {
if (st == dr) {
segTree[ind] = xs[st];
return;
}
int mid = (st + dr) / 2;
build(2 * ind, st, mid);
build(2 * ind + 1, mid + 1, dr);
segTree[ind] = segTree[ind * 2] + segTree[ind * 2 + 1];
}*/
void create(int ind, int left, int right,int val,int pos)
{
if (left == right)
{
segTree[ind] = val;
return;
}
int mid = (left + right) / 2;
if (pos <= mid) create(2 * ind, left, mid,val,pos);
else create(2 * ind + 1, mid + 1, right,val,pos);
segTree[ind] = segTree[2 * ind] + segTree[2 * ind + 1];
}
int query(int ind, int st, int dr, int l, int r) {
//inclus in interval
if (st >= l && dr <= r) {
return segTree[ind];
}
//Nu contribue cu nimic la query deci returnam INT_MIN pentru comparatie
if (dr<l || st>r) {
return 0;
}
//overlaps
int mid = (st + dr) / 2;
int left = query(2 * ind, st, mid, l, r);
int right = query(2 * ind + 1, mid + 1, dr, l, r);
return left + right;
}
void update(int ind, int st, int dr, int val, int pos,int op) {
if (st == dr) {
if (op == 1) {
segTree[ind] -= val;
return;
}
else if (op == 2) {
segTree[ind] += val;
return;
}
}
int mid = (st + dr) / 2;
if (pos <= mid) {
update(2 * ind, st, mid, val, pos,op);
}
else {
update(2 * ind + 1, mid + 1, dr, val, pos,op);
}
segTree[ind] = segTree[2 * ind] + segTree[2 * ind + 1];
}
int main()
{
int e;
int t;
fin >> t;
for (int i = 0; i < t; i++) {
fin >> n;
for (int i = 1; i <= n; i++) {
fin >> e;
create(1, 1, n, e, i);
}
fin >> m;
//build(1, 1, n);
int x, a, b, c;
for (int i = 0; i < m; i++) {
fin >> x >> a >> b;
if (x == 0) {
fout << query(1, 1, n, a+1, b+a) + query(1,1,n,a-b,a-1) << '\n';
}
else if (x == 2 || x == 1) {
update(1, 1, n, a, b, x);
}
else {
fin >> c;
update(1, 1, n, a, b, 1);
update(1, 1, n, a, c, 2);
}
}
}
return 0;
}