#include <bits/stdc++.h>
#include <iomanip>
using namespace std;
# define pb push_back
# define pf push_front
# define ff first
# define ss second
# define ll long long
# define lc id * 2
# define rc lc | 1
//# define int long long
# define mid (r + l) / 2
//# define mp make_pair
typedef long double ld;
#define kill(x) cout << x << '\n', exit(0)
typedef pair<int, char> pic;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef priority_queue<pll, vector<pll>, greater<pll>> pq;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const ll maxn = 1e5 + 10, maxm = 4e5 + 10, sq = 1300, LOG = 30, mod = 1e9 + 7;
const ll inf = 1e17;
int n, m, k;
set<pii> st0, st1, ts0, ts1;
set<int> sts[2];
inline ll Pow(ll a, ll b, ll mod){
ll ans = 1ll;
while(b){
if(b & 1) ans = ans * a % mod;
b >>= 1, a = a * a % mod;
}
return ans;
}
int main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin >> n >> m >> k;
bool check = 1, check2 = 1;
set<int> cols, rws;
for(int i = 1; i <= k; i ++){
char c;
int v, u;
cin >> c >> v >> u;
cols.insert(u);
rws.insert(v);
bool b = 0;
if(c == '-') b = 1;
if(b) sts[v % 2].insert(u % 2);
else sts[v % 2].insert(! (u % 2));
if(v % 2){
st0.insert({u, b});
if(st1.find({u, b}) != st1.end() || st0.find({u, ! b}) != st0.end()) check = 0;
}
else{
st1.insert({u, b});
if(st0.find({u, b}) != st0.end() || st1.find({u, ! b}) != st1.end()) check = 0;
}
if(u % 2){
ts0.insert({v, b});
if(ts1.find({v, b}) != ts1.end() || ts0.find({v, ! b}) != ts0.end()) check2 = 0;
}
else{
ts1.insert({v, b});
if(ts0.find({v, b}) != ts0.end() || ts1.find({v, ! b}) != ts1.find({v, ! b})) check2 = 0;
}
}
ll ans = 0;
if(check) ans = Pow(2, m - cols.size(), mod);
if(check2){
ans = (ans + Pow(2, n - rws.size(), mod)) % mod;
if((sts[0].find(1) != sts[0].end() && sts[1].find(1) != sts[1].end()) || (sts[0].find(0) != sts[0].end() && sts[1].find(0) != sts[1].end())) {}
else if(k > 0) ans = (ans - 1 + mod) % mod;
else ans = (ans - 2 + mod) % mod;
}
cout << ans << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |