这份代码处理 k=2 的,去掉
#define int long long
后会挂掉,不知为何?
//coder: Feliks*GM-YB
#include<bits/stdc++.h>
#define fu(i,a,b) for(register int i = a, I = (b) + 1; i < I; ++i)
#define fd(i,a,b) for(register int i = a, I = (b) - 1; i > I; --i)
#define go(x) for(int i=first[x],y=v[i];i;i=nex[i],y=v[i])
#define mk make_pair
#define int long long
typedef long long ll;
using namespace std;
const int N=2e4+10;
const int mod=1e9+7;
inline int read(){
int x=0;char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x;
}int T,n,m,k,t;
int x[N],y[N];
ll s,ans,qi[5];
map<pair<int,int>,int> mp;
inline void init(){
fu(i,0,4)qi[i]=0;
ans=0;
mp.clear();
}inline ll power(ll x,int b){
ll res=1;
while(b){
if(b&1)res=res*x%mod;
b>>=1;
x=x*x%mod;
}return res;
}
signed main(){
// freopen("DATA.in","r",stdin);
// freopen("WTF.txt","w",stdout);
T=read();
while(T--){
init();
n=read(),m=read(),k=read(),t=read();
s=(1LL*n*m-t)%mod;
if(t==0){
if(k==2){
ans=(s*(s-1)/2%mod-1LL*n*(m-1)%mod-1LL*(n-1)*m%mod)%mod;
ans=(ans+mod)%mod;
printf("%lld\n",ans);
}else{
puts("0");
}continue;
}fu(i,1,t){
x[i]=read(),y[i]=read();
if(mp.find(mk(x[i],y[i]))==mp.end())
mp.insert(mk(mk(x[i],y[i]),0));
else mp[mk(x[i],y[i])]=0;
if(x[i]!=1 && mp.find(mk(x[i]-1,y[i]))==mp.end()){
mp.insert(mk(mk(x[i]-1,y[i]),3));
if(x[i]-1==1)mp[mk(x[i]-1,y[i])]--;
if(y[i]==1 || y[i]==m)mp[mk(x[i]-1,y[i])]--;
}else if(x[i]!=1)mp[mk(x[i]-1,y[i])]--;
if(y[i]!=1 && mp.find(mk(x[i],y[i]-1))==mp.end()){
mp.insert(mk(mk(x[i],y[i]-1),3));
if(y[i]-1==1)mp[mk(x[i],y[i]-1)]--;
if(x[i]==1 || x[i]==n)mp[mk(x[i],y[i]-1)]--;
}else if(y[i]!=1)mp[mk(x[i],y[i]-1)]--;
if(x[i]!=n && mp.find(mk(x[i]+1,y[i]))==mp.end()){
mp.insert(mk(mk(x[i]+1,y[i]),3));
if(x[i]+1==n)mp[mk(x[i]+1,y[i])]--;
if(y[i]==1 || y[i]==m)mp[mk(x[i]+1,y[i])]--;
}else if(x[i]!=n)mp[mk(x[i]+1,y[i])]--;
if(y[i]!=m && mp.find(mk(x[i],y[i]+1))==mp.end()){
mp.insert(mk(mk(x[i],y[i]+1),3));
if(y[i]+1==m)mp[mk(x[i],y[i]+1)]--;
if(x[i]==1 || x[i]==n)mp[mk(x[i],y[i]+1)]--;
}else if(y[i]!=m)mp[mk(x[i],y[i]+1)]--;
}qi[2]=4,qi[3]=2*(n+m-4),qi[4]=1LL*(n-2)*(m-2)%mod;
if(n==1)qi[1]=2,qi[2]=m-2,qi[3]=qi[4]=0;
if(m==1)qi[1]=2,qi[2]=n-2,qi[3]=qi[4]=0;
for(map<pair<int,int>,int>::iterator it=mp.begin();
it!=mp.end();it++){
pair<int,int> p=it->first;int q=4,x=it->second;
//cout<<p.first<<' '<<p.second<<' '<<it->second<<endl;
if(p.first==1 || p.first==n)q--;
if(p.second==1 || p.second==m)q--;
if(n==1 || m==1)q--,x--;
qi[q]--,qi[max(0ll,x)]++;
}//cout<<qi[0]<<','<<qi[1]<<','<<qi[2]<<','<<
//qi[3]<<','<<qi[4]<<endl;
if(k==2){
ans=(s*(s-1)/2ll)%mod;
ans=(ans-1ll*(qi[1]+2ll*qi[2]+3ll*qi[3]+4ll*qi[4])/2ll)%mod;
printf("%lld\n",(ans+mod)%mod);
}else{
puts("0");
}
}
return 0;
}