This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
/*
Oce nas,
koji si na nebesima,
da se sveti ime Tvoje,
da dodje carstvo Tvoje,
da bude volja Tvoja,
i na zemlji, kao i na nebu.
Hleb nas nasusni daj nam danas,
i oprosti nam dugove nase,
kao sto i mi oprastamo duznicima svojim,
i ne uvedi nas u iskusenje,
no izbavi nas od zloga.
Jer je Tvoje Carstvo,
i sila, i slava,
u vekove vekova.
Amin.
*/
using namespace std;
typedef vector<int> vc;
typedef vector<vector<int>> vvc;
using ll = long long;
using ld = long double;
#define yes cout << "YES\n"
#define no cout << "NO\n"
#define F first
#define S second
#define pb push_back
#define pf push_front
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define int long long
const int mod = 1e9+7;
map<int, int> rwg;
map<int, int> clg;
ll exp(ll x, ll n, ll m) {
if(n<0)return 0;
x %= m;
ll res = 1;
while (n > 0) {
if (n % 2 == 1) {
res = res * x % m;
}
x = x * x % m;
n /= 2;
}
return res;
}
void solve(){
int n, m, k;
cin >> n >> m >> k;
if(k==0){
cout << ((exp(2, n, mod)+exp(2, m, mod)-2)%mod+mod)%mod << '\n';
return;
}
vector<pair<int, int>> a;
vector<pair<int, int>> b;
set<int> rw;
set<int> col;
for(int i=0; i< k; i++){
char c;
int x, y;
cin >> c >> x >> y;
rw.insert(x);
col.insert(y);
if(c=='+')a.pb({x, y});
else b.pb({x, y});
}
int ans1=n-rw.size();
int ans2=m-col.size();
for(pair<int, int> p : a){
int whr = (p.S%2)? 1:-1;
if(rwg[p.F]==0)rwg[p.F]=whr;
else if(rwg[p.F]!=whr)ans1=-1;
}
for(pair<int, int> p : b){
int whr = (p.S%2)? -1:1;
if(rwg[p.F]==0)rwg[p.F]=whr;
else if(rwg[p.F]!=whr)ans1=-1;
}
for(pair<int, int> p : a){
int whr = (p.F%2)? 1:-1;
if(clg[p.S]==0)clg[p.S]=whr;
else if(clg[p.S]!=whr)ans2=-1;
}
for(pair<int, int> p : b){
int whr = (p.F%2)? -1:1;
if(clg[p.S]==0)clg[p.S]=whr;
else if(clg[p.S]!=whr)ans2=-1;
}
int chess=0;
for(pair<int, int> p : a){
int val=((p.F+p.S)%2)? 1:-1;
if(chess==0)chess=val;
if(chess!=val)chess=-2;
}
for(pair<int, int> p : b){
int val = ((p.F+p.S)%2)? -1:1;
if(chess==0)chess=val;
if(chess!=val)chess=-2;
}
ans1=exp(2, ans1, mod);
ans2=exp(2, ans2, mod);
if(chess==-2)cout << (ans1+ans2)%mod << '\n';
else cout << ((ans1+ans2-1)%mod+mod)%mod << '\n';
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
solve();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |