#include <bits/stdc++.h>
#define R(x) x = read()
#define ENDL push('\n');
#define SPACE push(' ');
#define int unsigned
using namespace std;
char pbuf[1<<20], *pp=pbuf;
inline void push(const char &c) {
if(pp - pbuf == 1<<20)fwrite(pbuf, 1, 1<<20, stdout),pp = pbuf;
*pp++ = c;
}
class io {public:~io() {fwrite(pbuf, 1, pp - pbuf, stdout);}} _;
inline void write(int x) {
if (x<0)x=-x,push('-');
int sta[35],top=0;
do {
sta[top++]=x%10,x/=10;
} while (x);
while(top)push(sta[--top]^'0');
}
#ifndef LOCAL
char buf[1<<23],*p1=buf,*p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
inline int read() {
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();
return x*f;
}
int n,a[50010];
struct node{
int maxi,mini,lzy;
}t[500010];
void build(int i,int l,int r){
if(l==r){
t[i].maxi=t[i].mini=a[l];
return;
}
int mid=(l+r)>>1;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
t[i].maxi=max(t[i*2].maxi,t[i*2+1].maxi);
t[i].mini=min(t[i*2].mini,t[i*2+1].mini);
}
void pd(int i){
if(t[i].lzy){
t[i*2].maxi+=t[i].lzy;
t[i*2+1].mini+=t[i].lzy;
t[i*2+1].maxi+=t[i].lzy;
t[i*2].mini+=t[i].lzy;
t[i*2].lzy+=t[i].lzy;
t[i*2+1].lzy+=t[i].lzy;
t[i].lzy=0;
}
}
void add(int i,int l,int r,int ll,int rr,int x){
if(ll<=l&&r<=rr){
t[i].lzy+=x;
t[i].maxi+=x;
t[i].mini+=x;
return;
}
pd(i);
int mid=(l+r)>>1;
if(ll<=mid)add(i*2,l,mid,ll,rr,x);
if(rr>mid)add(i*2+1,mid+1,r,ll,rr,x);
t[i].maxi=max(t[i*2].maxi,t[i*2+1].maxi);
t[i].mini=min(t[i*2].mini,t[i*2+1].mini);
}
int ask(int i,int l,int r,int ll,int rr,int x){
pd(i);
if(ll<=l&&r<=rr){
if(x<=t[i].mini){
return 0;
}else if(x>t[i].maxi){
return r-l+1;
}else{
int mid=(l+r)>>1;
return ask(i*2,l,mid,ll,rr,x)+ask(i*2+1,mid+1,r,ll,rr,x);
}
}else{
int mid=(l+r)>>1,res=0;
if(ll<=mid)res+=ask(i*2,l,mid,ll,rr,x);
if(rr>mid)res+=ask(i*2+1,mid+1,r,ll,rr,x);
return res;
}
}
signed main(){
R(n);
for(int i=1;i<=n;i++)R(a[i]);
build(1,1,n);
for(int i=1,opt,l,r,c;i<=n;i++){
R(opt);R(l);R(r);R(c);
switch(opt){
case 0:{
add(1,1,n,l,r,c);
break;
}
case 1:{
write(ask(1,1,n,l,r,c*c));
push('\n');
break;
}
}
}
return 0;
}