#include <bits/stdc++.h> // NeOWami
using namespace std;
#define ft first
#define sc second
const int N = 51;
int n, m;
string s;
struct query {
int l, r, x, k;
};
query q[N];
namespace sub1 {
// 0 (chưa điền được gì), 1 (là 0), 2 (1) 3( đa giá trị);
int a[N];
int b[N];
bool check(int msk) {
for (int i = 0; i < n; i++) b[i] = msk >> i & 1;
for (int i = 0; i < n; i++) if (s[i] != '?') {
if (s[i] == '1' && b[i] != 1) return 0;
if (s[i] == '0' && b[i] != 0) return 0;
}
for (int i = 1; i <= m; i++) {
int l = q[i].l - 1, r = q[i].r - 1, x = q[i].x, k = q[i].k;
int cnt = 0, mmax = 0;
for (int j = l; j <= r; j++) {
if (b[j] == x) cnt++;
else cnt = 0;
mmax = max(mmax, cnt);
}
// cerr << "CHECK: " << msk << ": "; for (int i = 0; i < n; i++) cerr << b[i] << " "; cerr << "\n";
// cerr << "WITH " << l << " " << r << " " << x << " " << k << " | " << cnt << " " << mmax << '\n';
if (mmax < k) return 0;
}
return 1;
}
void solve() {
bool ok = 0;
for (int msk = 0; msk < (1 << n); msk++) {
if (!check(msk)) continue;
ok = 1;
// cerr << "ok heheheh: " << msk << ": "; for (int i = 0; i < n; i++) cerr << b[i] << " "; cerr << "\n";
for (int i = 0; i < n; i++) if (s[i] == '?') {
int x = b[i] + 1;
a[i] |= x;
// cerr << a[i] << " ";
}
// cerr << "\n";
}
if (!ok) return cout <<-1, void();
for (int i = 0; i < n; i++) {
if (s[i] == '?') {
if (a[i] == 3) cout << '?';
else cout <<a[i] - 1;
}
else cout << s[i];
}
}
};
namespace sub2 {
vector<int> pos;
// 0 (chưa điền được gì), 1 (là 0), 2 (1) 3( đa giá trị);
int a[N], b[N], sz;
bool checksub() {
for (int i = 0; i < n; i++) {
if (s[i] == '?') pos.push_back(i);
}
return (int)pos.size() <= 15;
}
bool check(int msk) {
for (int i = 0; i < sz; i++) b[pos[i]] = msk >> i & 1;
for (int i = 1; i <= m; i++) {
int l = q[i].l - 1, r = q[i].r - 1, x = q[i].x, k = q[i].k;
int cnt = 0, mmax = 0;
for (int j = l; j <= r; j++) {
if (b[j] == x) cnt++;
else cnt = 0;
mmax = max(mmax, cnt);
}
// cerr << "CHECK: " << msk << ": "; for (int i = 0; i < n; i++) cerr << b[i] << " "; cerr << "\n";
// cerr << "WITH " << l << " " << r << " " << x << " " << k << " | " << cnt << " " << mmax << '\n';
if (mmax < k) return 0;
}
return 1;
}
void solve() {
sz = pos.size();
for (int i = 0; i < n; i++) {
if (s[i] != '?') b[i] = a[i] = (s[i] - '0');
}
bool ok = 0;
for (int msk = 0; msk < (1 << sz); msk++) {
if (!check(msk)) continue;
ok = 1;
// cerr << "ok heheheh: " << msk << ": "; for (int i = 0; i < n; i++) cerr << b[i] << " "; cerr << "\n";
for (int i = 0; i < sz; i++) {
int x = b[pos[i]] + 1;
a[pos[i]] |= x;
// cerr << a[i] << " ";
}
// cerr << "\n";
}
if (!ok) return cout <<-1, void();
for (int i = 0; i < n; i++) {
if (s[i] == '?') {
if (a[i] == 3) cout << '?';
else cout <<a[i] - 1;
}
else cout << s[i];
}
}
};
namespace sub3 {
bool checksub() {
for (int i = 1; i <= m; i++) if (q[i].k != 1) return 0;
return 1;
}
int a[N]; //0 (0), 1 (là 1), 2 (chưa điền gì)
bool delQ[N];
int calc(int l, int r, int x) {
int cnt = 0;
for (int j = l; j <= r; j++) {
if (a[j] == x) return 2;
else if (a[j] == 2) cnt++;
}
return cnt;
}
void solve() {
for (int i = 0; i < n; i++) {
if (s[i] == '?') a[i] = 2;
else a[i] = (s[i] - '0');
}
while(1) {
int change = 0;
for (int i = 1; i <= m; i++) if (!delQ[i]) {
// if (q[i].k == 0) continue;
int cnt = calc(q[i].l - 1, q[i].r - 1, q[i].x);
if (cnt == 0) return cout << -1, void();
if (cnt == 1) {
change = i;
delQ[i] = 1;
break;
}
}
if (!change) break;
for (int i = q[change].l - 1; i <= q[change].r - 1; i++) if (a[i] == 2) {
a[i] = q[change].x;
break;
}
}
for (int i = 0; i < n; i++) {
if (a[i] == 2) cout << '?';
else cout <<a[i];
}
}
};
using pii = pair<int, int>;
namespace sub4 {
bool checksub() {
int tar = q[1].x;
for (int i = 1; i <= m; i++) if (q[i].x != tar) return 0;
return 1;
}
int a[N]; //0 (0), 1 (là 1), 2 (chưa điền gì)
bool delQ[N];
int ps[N];
pii calc(int l, int r, int x, int k) {
ps[l - 1] = 0;
for (int i = l; i <= r; i++) {
ps[i] = ps[i - 1];
if (a[i] == x || a[i] == 2) ps[i]++;
}
int L = -1, R = n;
for (int i = l + k - 1; i <= r; i++) {
int j = i - k + 1;
if (ps[i] - ps[j - 1] == k) {
L = max(L, j);
R = min(R, i);
}
}
return {L, R};
}
void solve() {
for (int i = 0; i < n; i++) {
if (s[i] == '?') a[i] = 2;
else a[i] = (s[i] - '0');
}
while(1) {
bool change = 0;
for (int i = 1; i <= m; i++) if (!delQ[i]) {
// if (q[i].k == 0) continue;
pii item = calc(q[i].l - 1, q[i].r - 1, q[i].x, q[i].k);
int L = item.ft, R = item.sc;
if (L == -1 || R == n) return cout << -1, void();
if (L <= R) {
change = 1;
for (int j = L; j <= R; j++) a[j] = q[i].x;
delQ[i] = 1;
break;
}
}
if (!change) break;
}
for (int i = 0; i < n; i++) {
if (a[i] == 2) cout << '?';
else cout <<a[i];
}
}
};
namespace subCan {
int a[N]; //0 (0), 1 (là 1), 2 (chưa điền gì)
bool delQ[N];
int ps[N];
pii calc(int l, int r, int x, int k) {
ps[l - 1] = 0;
for (int i = l; i <= r; i++) {
ps[i] = ps[i - 1];
if (a[i] == x || a[i] == 2) ps[i]++;
}
int L = -1, R = n;
for (int i = l + k - 1; i <= r; i++) {
int j = i - k + 1;
if (ps[i] - ps[j - 1] == k) {
L = max(L, j);
R = min(R, i);
}
}
return {L, R};
}
void solve() {
for (int i = 0; i < n; i++) {
if (s[i] == '?') a[i] = 2;
else a[i] = (s[i] - '0');
}
while(clock() < 0.8 * CLOCKS_PER_SEC) {
while(1) {
bool change = 0;
for (int i = 1; i <= m; i++) if (!delQ[i]) {
// if (q[i].k == 0) continue;
pii item = calc(q[i].l - 1, q[i].r - 1, q[i].x, q[i].k);
int L = item.ft, R = item.sc;
if (L == -1 || R == n) return cout << -1, void();
if (L <= R) {
change = 1;
for (int j = L; j <= R; j++) a[j] = q[i].x;
delQ[i] = 1;
break;
}
}
if (!change) break;
}
for (int i = 1; i <= m; i++) delQ[i] = 0;
}
for (int i = 0; i < n; i++) {
if (a[i] == 2) cout << '?';
else cout <<a[i];
}
}
};
signed main() {
cin.tie(NULL)->sync_with_stdio(false);
if(ifstream("MAKHOA.inp")) {
freopen("MAKHOA.inp", "r", stdin);
freopen("MAKHOA.out", "w", stdout);
}
cin >> n >> m >> s;
for (int i = 1; i <= m; i++) cin >> q[i].k >> q[i].x >> q[i].l >> q[i].r;
// if (n <= 15) return sub1::solve(), 0;
// if (sub2::checksub()) return sub2::solve(), 0;
// if (sub3::checksub()) return sub3::solve(), 0;
// if (sub4::checksub()) return sub4::solve(), 0;
return subCan::solve(), 0;
cout << -1;
return 0;
}