Submission #1293654

#TimeUsernameProblemLanguageResultExecution timeMemory
1293654Hamed_GhaffariPlus Minus (BOI17_plusminus)C++20
100 / 100
91 ms9828 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

#define SZ(x) int(x.size())

const ll MOD = 1e9 + 7;

inline ll power(ll a, ll b) {
    ll res = 1;
    while(b) {
        if(b&1) (res *= a) %= MOD;
        (a *= a) %= MOD;
        b >>= 1;
    }
    return res;
}

int n, m, k, tot;
map<int, bool> rw, cl;
bool badr, badc, badt;

int32_t main() {
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
    cin >> n >> m >> k;
    if(k==0) return cout << (power(2, n) + power(2, m) - 2 + MOD)%MOD << '\n', 0;
    tot = -1;
    while(k--) {
        int x, y, z;
        char c;
        cin >> c >> x >> y;
        z = c=='+';
        if(rw.find(x)==rw.end()) rw[x] = (y&1)^z;
        else if(((y&1)^z)!=rw[x]) badr = 1;
        if(cl.find(y)==cl.end()) cl[y] = (x&1)^z;
        else if(((x&1)^z)!=cl[y]) badc = 1;
        if(tot==-1) tot = (x&1)^(y&1)^z;
        else if(((x&1)^(y&1)^z)!=tot) badt = 1;
    }
    ll ans = 0;
    if(!badr) (ans += power(2, n-SZ(rw))) %= MOD;
    if(!badc) (ans += power(2, m-SZ(cl))) %= MOD;
    if(!badt) (ans += MOD-1) %= MOD;
    cout << ans << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...