func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 3e5 + 10;   const int INF = 1e9;   int n, ans, ansl, ansr;   char s[maxn];   int a[maxn];   struct Node {     int pre, min, cnt, id;     Node() {       pre = cnt = id = 0;       min = INF;     }     Node(int _pre, int _min, int _cnt, int _id)         : pre(_pre), min(_min), cnt(_cnt), id(_id) {}   } b[maxn], pre[maxn], suf[maxn], tmppre[maxn], tmpsuf[maxn];   bool cmpl(const Node& a, const Node& b) {     return a.min - a.pre < b.min - b.pre;   }   bool cmpr(const Node& a, const Node& b) { return a.min < b.min; }   void cans(int cur, int l, int r) {     if (ans < cur) ans = cur, ansl = l, ansr = r;   }   Node merge(const Node& a, const Node& b) {     Node ret;     ret.pre = a.pre + b.pre;     if (a.min < b.min + a.pre) {       ret.min = a.min;       ret.cnt = a.cnt;     } else if (a.min == b.min + a.pre) {       ret.min = a.min;       ret.cnt = a.cnt + b.cnt;     } else {       ret.min = b.min + a.pre;       ret.cnt = b.cnt;     }     return ret;   }   Node rev(Node a) {     a.pre = -a.pre;     a.min = -a.min;     return a;   }   vector<Node> get(int l, int r, int k) {     vector<Node> ret;     tmppre[l - 1] = Node();     for (int i = l; i <= r; ++i) tmppre[i] = merge(tmppre[i - 1], b[i]);     tmpsuf[r + 1] = Node();     for (int i = r; i >= l; --i) tmpsuf[i] = merge(b[i], tmpsuf[i + 1]);     for (int i = l; i <= r; ++i)       if (a[i] == k) {         ret.push_back(merge(merge(tmppre[i - 1], rev(b[i])), tmpsuf[i + 1]));         ret.back().id = b[i].id;       }     return ret;   }   vector<Node> uniql(vector<Node> a) {     vector<Node> ret;     for (auto v : a) {       if (ret.empty() || ret.back().min - ret.back().pre != v.min - v.pre)         ret.push_back(v);       else if (ret.back().cnt < v.cnt)         ret.back() = v;     }     return ret;   }   vector<Node> uniqr(vector<Node> a) {     vector<Node> ret;     for (auto v : a) {       if (ret.empty() || ret.back().min != v.min)         ret.push_back(v);       else if (ret.back().cnt < v.cnt)         ret.back() = v;     }     return ret;   }   void calc(vector<Node> lv, vector<Node> rv, Node L, Node R, bool debug) {     int id;     for (auto& v : lv) id = v.id, v = merge(L, v), v.id = id;     for (auto& v : rv) id = v.id, v = merge(v, R), v.id = id;     sort(lv.begin(), lv.end(), cmpl);     sort(rv.begin(), rv.end(), cmpr);     lv = uniql(lv);     rv = uniqr(rv);     int l = 0;     for (int i = 0; i < rv.size(); ++i) {       while (l < lv.size() && lv[l].min <= lv[l].pre + rv[i].min) {         if (lv[l].min < lv[l].pre + rv[i].min)           cans(lv[l].cnt, lv[l].id, rv[i].id);         else           cans(lv[l].cnt + rv[i].cnt, lv[l].id, rv[i].id);         ++l;       }       if (l < lv.size()) cans(rv[i].cnt, lv[l].id, rv[i].id);     }   }   void solve(int l, int r) {     if (l == r) return;     int mid = l + r >> 1;     calc(get(l, mid, 1), get(mid + 1, r, -1), pre[l - 1], suf[r + 1], 0);     calc(get(l, mid, -1), get(mid + 1, r, 1), pre[l - 1], suf[r + 1], 0);     solve(l, mid);     solve(mid + 1, r);   }   int main() {     scanf( %d , &n);     scanf( %s , s + 1);     int sum = 0;     for (int i = 1; i <= n; ++i) {       a[i] = s[i] ==  (  ? 1 : -1;       b[i] = Node(a[i], a[i], 1, i);       sum += a[i];     }     if (sum) {       puts( 0 );       puts( 1 1 );       return 0;     }     for (int i = 1; i <= n; ++i) pre[i] = merge(pre[i - 1], b[i]);     for (int i = n; i >= 1; --i) suf[i] = merge(b[i], suf[i + 1]);     ans = pre[n].cnt;     ansl = ansr = 1;     solve(1, n);     printf( %d n , ans);     printf( %d %d n , ansl, ansr);     return 0;   }   