#include <bits/stdc++.h>
#define int long long
#define lc p<<1
#define rc p<<1|1
using namespace std;
struct node{
int l,r,sum;
}tr[800005];
int p[600005],s[600005];
char t[600005];
int a[600005],b[600005];
int uni[600005],cnt,pt;
void build(int p,int l,int r){
tr[p].l=l;
tr[p].r=r;
tr[p].sum=0;
if(l==r) return;
int mid=(l+r)>>1;
build(lc,l,mid);
build(rc,mid+1,r);
}
void update(int p,int pos,int d){
if(tr[p].l==tr[p].r){
tr[p].sum+=d;
return;
}
int mid=(tr[p].l+tr[p].r)>>1;
if(pos<=mid) update(lc,pos,d);
else update(rc,pos,d);
tr[p].sum=tr[lc].sum+tr[rc].sum;
}
int query(int p,int x,int y){
if(x>tr[p].r||y<tr[p].l) return 0;
if(x<=tr[p].l&&tr[p].r<=y) return tr[p].sum;
return query(lc,x,y)+query(rc,x,y);
}
inline int gd(int x){
return lower_bound(uni+1,uni+pt+1,x)-uni;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>p[i];
s[++cnt]=p[i];
}
for(int i=1;i<=q;i++){
cin>>t[i]>>a[i]>>b[i];
if(t[i]=='!'){
s[++cnt]=b[i];
}else{
s[++cnt]=a[i];
s[++cnt]=b[i];
}
}
sort(s+1,s+cnt+1);
pt=unique(s+1,s+cnt+1)-s-1;
for(int i=1;i<=pt;i++){
uni[i]=s[i];
}
build(1,1,pt);
for(int i=1;i<=n;i++){
update(1,gd(p[i]),1);
}
for(int i=1;i<=q;i++){
if(t[i]=='!'){
int k=a[i],x=b[i];
update(1,gd(p[k]),-1);
p[k]=x;
update(1,gd(p[k]),1);
}else{
int l=gd(a[i]);
int r=gd(b[i]);
cout<<query(1,l,r)<<"\n";
}
}
}
TLE60分
@俞天行