RT
#include<bits/stdc++.h>
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
using namespace std;
typedef long long ll;
const ll MAXN=1e6+5;
ll n,blen,q,op,x,y,z;
struct node{
ll num,id;
bool operator < (const node &oth)const{
return num<oth.num;
}
}a[MAXN];
struct block{
ll l,r;
}t[1005];
ll cnt,block_num[MAXN];
//bool cmp_num(node n1,node n2){
// return n1.num<n2.num;
//}
//bool cmp_id(node n1,node n2){
// return n1.id<n2.id;
//}
ll solve(ll L,ll R,ll X){
if(X>a[R].num)return 0;
if(X<=a[L].num)return R-L+1;
ll res=lower_bound(a+L,a+1+R,(node){X,0})-a;
return R-res+1;
}
int main(){
// freopen("111.in","r",stdin);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i].num;
for(int i=1;i<=n;i++)a[i].id=i;
blen=sqrt(n);
for(int i=1;i<=n;i+=blen){
cnt++;
t[cnt].l=i;
t[cnt].r=min(i+blen-1,n);
for(int j=t[cnt].l;j<=t[cnt].r;j++)block_num[j]=cnt;
}
for(int i=1;i<=cnt;i++)stable_sort(a+t[i].l,a+1+t[i].r,[](node n1,node n2){
return n1.num<n2.num;
});
cin>>q;
for(int i=1;i<=q;i++){
cin>>op;
if(op){
cin>>x>>y;
ll b_id=block_num[x];
for(int i=t[b_id].l;i<=t[b_id].r;i++)if(a[i].id==x){
a[i].num=y;
break;
}
}
else{
cin>>x>>y>>z;
if(block_num[x]==block_num[y]){
ll res=0;
for(int i=t[block_num[x]].l;i<=t[block_num[x]].r;i++)if(a[i].num>=z&&a[i].id>=x&&a[i].id<=y)res++;
cout<<res<<'\n';
continue;
}
ll res=0;
for(int i=t[block_num[x]].l;i<=t[block_num[x]].r;i++)if(a[i].num>=z&&a[i].id>=x&&a[i].id<=y)res++;
for(int i=t[block_num[y]].l;i<=t[block_num[y]].r;i++)if(a[i].num>=z&&a[i].id>=x&&a[i].id<=y)res++;
for(int i=block_num[x]+1;i<=block_num[y]-1;i++)res+=solve(t[i].l,t[i].r,z);
cout<<res<<'\n';
}
// cout<<"case "<<i<<endl;
}
return 0;
}