danielvitor23

F. Distinct

Jun 8th, 2024
505
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.42 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #ifdef ENABLE_DEBUG
  3.   #define DEBUG(x) std::cout << x << std::endl
  4. #else
  5.   #define DEBUG(x)
  6. #endif
  7. #define fi first
  8. #define se second
  9. #define pb push_back
  10. #define all(x) x.begin(),x.end()
  11. #define rall(x) x.rbegin(),x.rend()
  12. using namespace std;
  13. using ii = pair<int, int>;
  14. using i64 = long long;
  15. const int INF = 0x3f3f3f3f;
  16. const i64 INFLL = 0x3f3f3f3f3f3f3f3f;
  17. const i64 MOD = (1LL<<61)-1;
  18.  
  19. template<class T>
  20. class SparseTable {
  21.     std::vector<std::vector<T>> st;
  22.     std::vector<int> log2;
  23.     T neutral = -INF;
  24.     const int nLog = 20;
  25.     T join(T a, T b) {
  26.         return std::max(a, b);
  27.     }
  28. public:
  29.     template<class MyIterator>
  30.     SparseTable(MyIterator begin, MyIterator end) {
  31.         int n = end-begin;
  32.         log2.resize(n+1);
  33.         log2[1] = 0;
  34.         for (int i = 2; i <= n; ++i)
  35.             log2[i] = log2[i/2]+1;
  36.         st.resize(n, std::vector<T>(nLog, neutral));
  37.         for (int i = 0; i < n; ++i, ++begin)
  38.             st[i][0] = *begin;
  39.         for (int j = 1; j < nLog; ++j)
  40.             for (int i = 0; i+(1<<(j-1)) < n; ++i)
  41.                 st[i][j] = join(st[i][j-1], st[i+(1<<(j-1))][j-1]);
  42.     }
  43.     T queryRMQ(int l, int r) {
  44.         int j = log2[r-l+1];
  45.         return join(st[l][j], st[r-(1 << j)+1][j]);
  46.     }
  47. };
  48.  
  49. vector<int> getPrev(const vector<int> &a) {
  50.     int n = a.size();
  51.     vector<int> v(n, -1);
  52.  
  53.     stack<int> st;
  54.     for (int i = n-1; i >= 0; --i) {
  55.         while (!st.empty() and a[i] <= a[st.top()]) {
  56.             st.pop();
  57.         }
  58.         v[i] = st.empty() ? -1 : st.top();
  59.         st.push(i);
  60.     }
  61.  
  62.     return v;
  63. }
  64.  
  65. void solve() {
  66.   int n, q; cin >> n >> q;
  67.  
  68.   string s; cin >> s;
  69.  
  70.     vector<int> pref(n+1, 0);
  71.  
  72.     int c = 0;
  73.   for (int i = 1; i <= n; ++i) {
  74.         if (s[i-1] == '/') {
  75.             --c;
  76.         }
  77.         else {
  78.             ++c;
  79.         }
  80.         pref[i] = c;
  81.   }
  82.  
  83.     // for (int i = 1; i <= n; ++i) {
  84.     //  cout << pref[i] << ' ';
  85.     // }
  86.     // cout << '\n';
  87.  
  88.     auto vec = getPrev(pref);
  89.  
  90.     // for (int i = 1; i <= n; ++i) {
  91.     //  cout << vec[i] << ' ';
  92.     // }
  93.     // cout << '\n';
  94.  
  95.     SparseTable<int> st(pref.begin(), pref.end());
  96.  
  97.     for (int i = 0; i < q; ++i) {
  98.         int l, r; cin >> l >> r;
  99.  
  100.         int R = vec[l-1] == -1 ? r : min(r, vec[l-1] - 1);
  101.  
  102.         // cout << l << ' ' << R << '\n';
  103.  
  104.         if (R == l - 1) {
  105.             cout << "2\n";
  106.             continue;
  107.         }
  108.  
  109.         int mx = st.queryRMQ(l, R) - pref[l-1];
  110.  
  111.         // cout << l << ' ' << R << ' ' << mx << '\n';
  112.  
  113.         int ans = mx + 1;
  114.  
  115.         if (R < r)
  116.             ++ans;
  117.  
  118.         cout << ans << '\n';
  119.     }
  120. }
  121.  
  122. int main() {
  123.   cin.tie(0)->sync_with_stdio(0);
  124.  
  125.   int tc; cin >> tc;
  126.   while (tc--) solve();
  127. }
Advertisement
Add Comment
Please, Sign In to add comment