#include #include #include #include #include #include #include #include #include using namespace std; typedef unsigned int uint; typedef unsigned long long LL; #define FOR(k,a,b) for(uint k(a); k < (b); ++k) #define REP(k,a) for(uint k=0; k < (a); ++k) #define MOD 1000000007 int BFTestter(vector a, int D) { vector > b; REP(i,a.size()) b.push_back(make_pair(a[i],i)); sort(b.begin(),b.end()); int res = 1; while (next_permutation(b.begin(),b.end())) { bool ok = 1; REP(i,b.size()-1) { if(b[i].first>=b[i+1].first+D) { ok = 0; } } if(ok) ++res; } return res; } LL invmod(LL a) { int p = MOD-2; LL res = 1; a %= MOD; while(p) { if(p&1) { res *= a; res %= MOD; } a *= a; a %= MOD; p >>= 1; } return res; } struct FenwickTree { vector data; void init(int n) { data.resize(n); } void inc(int idx,int val) { for(;idx=0) { ret+=data[r]; r=(r&(r+1))-1; } return ret; } }; vector Solver(int N, int M, int D, vector A, vector P, vector V) { vector binom(1e5+10), invbinom(1e5+10), inverse(1e5+10); //init binom binom[0]=invbinom[0]=inverse[0]=1; FOR(i,1, 100002) { binom[i] = (i * binom[i-1])%MOD; invbinom[i] = invmod(binom[i]); inverse[i] = invmod(i); } vector B; B=A; B.insert(B.end(),V.begin(),V.end()); sort(B.begin(),B.end()); B.erase(unique(B.begin(),B.end()),B.end()); vector C(B.size()), su(B.size()); REP(i,A.size()) { A[i]=distance(B.begin(),lower_bound(B.begin(),B.end(),A[i])); } REP(i,V.size()) { V[i]=distance(B.begin(),lower_bound(B.begin(),B.end(),V[i])); } REP(i,B.size()) { C[i]=distance(B.begin(),lower_bound(B.begin(),B.end(),B[i]-D+1)); } FenwickTree ft; ft.init(B.size()); REP(i,A.size()) { ft.inc(A[i],1); su[A[i]]++; } LL ans = 1, tmpl; int tmp, orig, actCount,sumGoodPosToInsert, newV; vector ta; ta.reserve(M+1); REP(i,B.size()) { int actCount = su[i]; int sumGoodPosToInsert = ft.sum(i-1) - ft.sum(C[i]-1); ans *= (binom[actCount+sumGoodPosToInsert]*invbinom[sumGoodPosToInsert])%MOD; ans %= MOD; } ta.push_back(ans); REP(i,M) { orig = A[P[i]]; //reverse actCount = su[orig]; sumGoodPosToInsert = ft.sum(orig-1) - ft.sum(C[orig]-1); ans *= inverse[sumGoodPosToInsert+actCount]; ans %= MOD; //go through the effected area FOR(j,orig+1,B.size()) { if(C[j]>orig) break; actCount = su[j]; sumGoodPosToInsert += su[j-1]; FOR(k,C[j-1],C[j]) sumGoodPosToInsert -= su[k]; //sumGoodPosToInsert = ft.sum(j-1) - ft.sum(C[j]-1); if(!sumGoodPosToInsert) sumGoodPosToInsert=1; ans *= (inverse[sumGoodPosToInsert+actCount]*(sumGoodPosToInsert))%MOD; ans%=MOD; } ft.inc(orig,-1); su[orig]--; //new calc newV = A[P[i]]=V[i]; ft.inc(newV,1); su[newV]++; actCount = su[newV]; sumGoodPosToInsert = ft.sum(newV-1) - ft.sum(C[newV]-1); ans *= (sumGoodPosToInsert + actCount); ans %= MOD; //go through the effected area FOR(j,newV+1,B.size()) { if(C[j]>newV) break; actCount = su[j]; //sumGoodPosToInsert = ft.sum(j-1) - ft.sum(C[j]-1); sumGoodPosToInsert += su[j-1]; FOR(k,C[j-1],C[j]) sumGoodPosToInsert -= su[k]; ans *= (inverse[sumGoodPosToInsert]*(sumGoodPosToInsert+actCount))%MOD; ans%=MOD; } ta.push_back(ans); } return ta; } int generator() { int N = 7; vector AA(N); REP(i,N) AA[i]=rand()%20; int D = rand()%16+1; int M=1000; vector P(M),V(M); REP(i,M) { P[i] = rand()%N; V[i] = rand()%20; } vector ans = Solver(N,M,D,AA,P,V); vector bfans; REP(i,M) { LL a = BFTestter(AA,D); AA[P[i]]=V[i]; bfans.push_back(a); if(ans[i]!=bfans[i]) { int alma =42; } } int alma = 42; return 0; } int main(int argv, char** argc) { #ifdef HOME freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif //generator(); int N,D,M; scanf("%d %d",&N,&D); vector A(N),B; REP(i,N) { scanf("%d",&A[i]); } scanf("%d",&M); vector P(M),V(M); REP(i,M) { scanf("%d %d",&P[i],&V[i]); --P[i]; } vector ans = Solver(N,M,D,A,P,V); FOR(i,1,ans.size()) { printf("%lld\n",ans[i]); } return 0; }