#include <bits/stdc++.h>
using namespace std;
#define int long long
#define lowbit(x) x&-x
const int N=3e5+7;
const int mod=1e9+7;
int x,p,n,q,a[N],tree[N],tree2[N];
void add(int x,int value){
for(int i=x;i<=n;i+=lowbit(i)){
tree[i]+=value;
}
return ;
}
int query(int x){
int ans=0;
for(int i=x;i>=1;i-=lowbit(i)){
ans+=tree[i];
}
return ans;
}
void add2(int x,int value){
for(int i=x;i<=n;i+=lowbit(i)){
tree2[i]+=value;
}
return ;
}
int query2(int x){
int ans=0;
for(int i=x;i>=1;i-=lowbit(i)){
ans+=tree2[i];
}
return ans;
}
int ksm(int a,int b){
int tmp=1;
while(b){
if(b&1){
tmp=tmp*a;
tmp%=mod;
}
a*=a;
a%=mod;
b>>=1;
}
return tmp;
}
signed main(){
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]==0){
add(i,1);
}
add2(i,a[i]);
}
while(q--){
cin>>x>>p;
if(a[x]==0 && p!=0){
add(x,-1);
}
if(a[x]!=0 && p==0){
add(x,1);
}
add2(x,-a[x]);
a[x]=p;
add2(x,p);
int l=1,r=n,mid;
while(l<r){
mid=(l+r)>>1;
if(query2(n)-query2(mid)==0){
r=mid;
}
else{
l=mid+1;
}
}
int cnt;
if(a[l]==0){
for(cnt=l;cnt>=1 && a[cnt-1]==0;cnt--){
}
}
else cnt=l;
int pos=query(cnt);
cout<<ksm(2,cnt-pos)<<"\n";
}
return 0;
}