wa13 20 21 22 29
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1e9+7 ;
int n,m,k;
struct node{
int x,y,kind;
}a[100010];
bool cmp(node p,node q){
if(p.x==q.x) return p.y<q.y;
return p.x<q.x;
}
int qp(int x,int y){
if(y==1) return x;
if(y==0) return 1;
int sum=qp(x,y/2);
if(y%2==1) return sum*sum%mod*x%mod;
else return sum*sum%mod;
}
int calc1(){
int num=0,pre=0;
for(int i=1,j=0;i<=k;i=j+1){
while(j<k&&a[j+1].x==a[i].x){
++j;
}
for(int l=i;l<=j;l++){
int x1=(a[l].y^a[i].y)&1,x2=(a[l].kind^a[i].kind);
if(x1!=x2) return 0;
}
num+=a[i].x-pre-1;
pre=a[i].x;
}
num+=n-pre;
return qp(2,num)%mod;
}
int calc2(){
for(int i=1;i<=k;i++){
swap(a[i].x,a[i].y);
}
sort(a+1,a+k+1,cmp);
int ret=calc1();
for(int i=1;i<=k;i++){
swap(a[i].x,a[i].y);
}
sort(a+1,a+1+k,cmp);
return ret%mod;
}
int calc3(){
for(int i=2;i<=k;i++){
int x1=(a[i-1].x^a[i].x^a[i-1].y^a[i].y)&1,x2=(a[i-1].kind^a[i].kind);
if(x1!=x2) return 0;
}
return 1+(!k);
}
signed main( ){
cin>>n>>m>>k;
for(int i=1;i<=k;i++){
char op;int xx,yy;
cin>>op>>xx>>yy;
a[i].kind=(op=='+'?1:0);
a[i].x=xx;
a[i].y=yy;
}
sort(a+1,a+k+1,cmp);
int c1=calc1();
int c2=calc2();
int c3=calc3();
cout<<((c1+c2)%mod-c3+mod)%mod;
return 0;
}
/*6576*/