Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #ifdef ENABLE_DEBUG
- #define DEBUG(x) std::cout << x << std::endl
- #else
- #define DEBUG(x)
- #endif
- #define fi first
- #define se second
- #define pb push_back
- #define all(x) x.begin(),x.end()
- #define rall(x) x.rbegin(),x.rend()
- using namespace std;
- using ii = pair<int, int>;
- using i64 = long long;
- const int INF = 0x3f3f3f3f;
- const i64 INFLL = 0x3f3f3f3f3f3f3f3f;
- const i64 MOD = (1LL<<61)-1;
- template<class T>
- class SparseTable {
- std::vector<std::vector<T>> st;
- std::vector<int> log2;
- T neutral = -INF;
- const int nLog = 20;
- T join(T a, T b) {
- return std::max(a, b);
- }
- public:
- template<class MyIterator>
- SparseTable(MyIterator begin, MyIterator end) {
- int n = end-begin;
- log2.resize(n+1);
- log2[1] = 0;
- for (int i = 2; i <= n; ++i)
- log2[i] = log2[i/2]+1;
- st.resize(n, std::vector<T>(nLog, neutral));
- for (int i = 0; i < n; ++i, ++begin)
- st[i][0] = *begin;
- for (int j = 1; j < nLog; ++j)
- for (int i = 0; i+(1<<(j-1)) < n; ++i)
- st[i][j] = join(st[i][j-1], st[i+(1<<(j-1))][j-1]);
- }
- T queryRMQ(int l, int r) {
- int j = log2[r-l+1];
- return join(st[l][j], st[r-(1 << j)+1][j]);
- }
- };
- vector<int> getPrev(const vector<int> &a) {
- int n = a.size();
- vector<int> v(n, -1);
- stack<int> st;
- for (int i = n-1; i >= 0; --i) {
- while (!st.empty() and a[i] <= a[st.top()]) {
- st.pop();
- }
- v[i] = st.empty() ? -1 : st.top();
- st.push(i);
- }
- return v;
- }
- void solve() {
- int n, q; cin >> n >> q;
- string s; cin >> s;
- vector<int> pref(n+1, 0);
- int c = 0;
- for (int i = 1; i <= n; ++i) {
- if (s[i-1] == '/') {
- --c;
- }
- else {
- ++c;
- }
- pref[i] = c;
- }
- // for (int i = 1; i <= n; ++i) {
- // cout << pref[i] << ' ';
- // }
- // cout << '\n';
- auto vec = getPrev(pref);
- // for (int i = 1; i <= n; ++i) {
- // cout << vec[i] << ' ';
- // }
- // cout << '\n';
- SparseTable<int> st(pref.begin(), pref.end());
- for (int i = 0; i < q; ++i) {
- int l, r; cin >> l >> r;
- int R = vec[l-1] == -1 ? r : min(r, vec[l-1] - 1);
- // cout << l << ' ' << R << '\n';
- if (R == l - 1) {
- cout << "2\n";
- continue;
- }
- int mx = st.queryRMQ(l, R) - pref[l-1];
- // cout << l << ' ' << R << ' ' << mx << '\n';
- int ans = mx + 1;
- if (R < r)
- ++ans;
- cout << ans << '\n';
- }
- }
- int main() {
- cin.tie(0)->sync_with_stdio(0);
- int tc; cin >> tc;
- while (tc--) solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment