#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define pf push_front
#define mp make_pair
#define fi first
#define se second
#define int long long
#define all(x) (x).begin(), (x).end()
typedef long double ld;
typedef long long ll;
typedef pair<ll,ll> pll;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<bool> vb;
typedef vector<vector<int>> vvi;
typedef vector<vector<bool>> vvb;
typedef vector<vector<ll>> vvll;
typedef vector<string> vs;
typedef vector<vector<string>> vvs;
typedef vector<char> vc;
typedef vector<vector<char>> vvc;
typedef map<int, int> mii;
typedef unordered_map<int, int> umii;
const int mod = 1e9 + 7;
const int inf = INTMAX_MAX;
const bool tc = false;
const int N = 3e5 + 5;
const int defval = -1e18;
int seg[4 * N];
int b[N];
int segfunction(int x, int y) {
return max(x, y);
}
int query(int l, int r, int pos, int ql, int qr) {
if (ql > r || l > qr) {
return defval;
}
if (ql <= l && r <= qr) {
return seg[pos];
}
int mid = (l + r) / 2;
return segfunction(query(l, mid, pos * 2, ql, qr), query(mid + 1, r, pos * 2 + 1, ql, qr));
}
void build(int l, int r, int pos) {
if (l == r) {
seg[pos] = b[l];
return;
}
int mid = (l + r) / 2;
build(l, mid, pos * 2);
build(mid + 1, r, pos * 2 + 1);
seg[pos] = segfunction(seg[pos * 2], seg[pos * 2 + 1]);
}
void update(int l, int r, int pos, int qpos, int qval) {
if (l == r) {
seg[pos] = qval;
return;
}
int mid = (l + r) / 2;
if (qpos <= mid) {
update(l, mid, pos * 2, qpos, qval);
} else {
update(mid + 1, r, pos * 2 + 1, qpos, qval);
}
seg[pos] = segfunction(seg[pos * 2], seg[pos * 2 + 1]);
}
inline void solve() {
int n, q;
cin >> n >> q;
vi a(n); for (int i = 0; i < n; i++) {char x; cin >> x; a[i] = (x - '0');}
for (int i = 0; i < n; i++) b[i] = (a[i] ? 0 : 1e18);
build(0, n - 1, 1);
for (int t = 1; t <= q; t++) {
string s; cin >> s;
if (s[0] == 't') {
int x; cin >> x; x--;
update(0, n - 1, 1, x, t);
continue;
}
int l, r; cin >> l >> r; l--; r -= 2;
int mx = query(0, n - 1, 1, l, r);
cout << max((int)0, t - mx) << '\n';
}
}
void setIO(string s) {
freopen((s + ".in").c_str(), "r", stdin);
freopen((s + ".out").c_str(), "w", stdout);
}
signed main() {
ios::sync_with_stdio(false);
cout.tie(0);
cin.tie(0);
//setIO();
int t = 1;
if (tc) {
cin >> t;
}
while (t--) {
solve();
}
}
Compilation message (stderr)
street_lamps.cpp: In function 'void setIO(std::string)':
street_lamps.cpp:102:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
102 | freopen((s + ".in").c_str(), "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
street_lamps.cpp:103:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
103 | freopen((s + ".out").c_str(), "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |