link
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long long ull;
const int N = 5e4 + 5, INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
int n;
int a[N];
int pos[N], block[N], st[N], ed[N], tag[N];
void change(int l, int r, int c)
{
if(pos[l] == pos[r])
{
for(int i = l;i <= r;i ++)
a[i] += c;
for(int i = st[pos[l]];i <= ed[pos[l]];i ++)
block[i] = a[i];
sort(block + st[pos[l]], block + ed[pos[l]] + 1);
}
else
{
for(int i = l;i <= ed[pos[l]];i ++)
a[i] += c;
for(int i = st[pos[l]];i <= ed[pos[l]];i ++)
block[i] = a[i];
sort(block + st[pos[l]], block + ed[pos[l]] + 1);
for(int i = pos[l] + 1;i <= pos[r] - 1;i ++)
tag[i] += c;
for(int i = st[pos[r]];i <= r;i ++)
a[i] += c;
for(int i = st[pos[r]];i <= ed[pos[r]];i ++)
block[i] = a[i];
sort(block + st[pos[r]], block + ed[pos[r]] + 1);
}
}
int query(int l, int r, int c)
{
c *= c;
int res = 0;
if(pos[l] == pos[r])
{
for(int i = l;i <= r;i ++)
if(a[i] + tag[pos[i]] <= c) res ++;
}
else
{
for(int i = l;i <= ed[pos[l]];i ++)
if(a[i] + tag[pos[l]] <= c) res ++;
for(int i = pos[l] + 1;i <= pos[r] - 1;i ++)
res += upper_bound(block + st[i], block + ed[i] + 1, c - tag[i]) - block - st[i];
for(int i = st[pos[r]];i <= r;i ++)
if(a[i] + tag[pos[r]] <= c) res ++;
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for(int i = 1;i <= n;i ++)
cin >> a[i];
int len = sqrt(n);
int num = n / len;
if(n % num) num ++;
for(int i = 1;i <= num;i ++)
st[i] = ed[i - 1] + 1, ed[i] = (i - 1) / len + 1;
ed[num] = n;
for(int i = 1;i <= num;i ++)
{
for(int j = st[i];j <= ed[i];j ++)
{
pos[j] = i;
block[j] = a[j];
}
sort(block + st[i], block + ed[i] + 1);
}
for(int i = 1;i <= n;i ++)
{
int op, l, r, c;
cin >> op >> l >> r >> c;
if(op == 0) change(l, r, c);
else cout << query(l, r, c) << '\n';
}
return 0;
}