rt
#include<bits/stdc++.h>
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;
}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;
ll mid=0,reg=R,ans=R;
while(L<=R){
mid=(L+R)>>1;
if(a[mid].num>=X)R=mid-1,ans=min(ans,mid);
else L=mid+1;
}
return reg-ans+1;
}
int main(){
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++)sort(a+t[i].l,a+1+t[i].r,cmp_num);
cin>>q;
for(int i=1;i<=q;i++){
cin>>op;
if(op){
cin>>x>>y;
ll b_id=block_num[x];
sort(a+t[b_id].l,a+1+t[b_id].r,cmp_id);
a[x].num=y;
sort(a+t[b_id].l,a+1+t[b_id].r,cmp_num);
}
else{
cin>>x>>y>>z;
if(block_num[x]==block_num[y]){
cout<<solve(x,y,z)<<endl;
continue;
}
ll res=0;
res+=solve(x,t[block_num[x]].r,z);
res+=solve(t[block_num[y]].l,y,z);
for(int i=block_num[x]+1;i<=block_num[y]-1;i++)res+=solve(t[i].l,t[i].r,z);
cout<<res<<endl;
}
}
return 0;
}
不知道哪里错了。