Submission #1365355

#TimeUsernameProblemLanguageResultExecution timeMemory
1365355TraianDanciuElection (BOI18_election)C++20
100 / 100
269 ms20356 KiB
#include <iostream>
#include <algorithm>

using namespace std;

const int MAXN = 500000;

string s;

struct SegmentTree {
  struct Node {
    int pref, suff, sum, answer;
  } tree[4 * MAXN];
  int n;

  Node join(Node a, Node b) {
    return Node {
      max(a.pref, a.sum + b.pref),
      max(a.suff + b.sum, b.suff),
      a.sum + b.sum,
      max({a.answer + b.sum, a.sum + b.answer, a.pref + b.suff})
    };
  }

  void build(int node, int left, int right) {
    if(left == right) {
      if(s[left] == 'C') {
        tree[node] = {0, 0, -1, 0};
      } else {
        tree[node] = {1, 1, 1, 1};
      }
    } else {
      int middle = (left + right) / 2;
      build(2 * node, left, middle);
      build(2 * node + 1, middle + 1, right);
      tree[node] = join(tree[2 * node], tree[2 * node + 1]);
    }
  }

  void init(int n) {
    this->n = n;
    build(1, 1, n);
  }

  Node query(int node, int left, int right, int qleft, int qright) {
    if(qleft <= left && right <= qright) {
      return tree[node];
    }
    int middle = (left + right) / 2;
    Node answer = {0, 0, 0, 0};
    if(qleft <= middle) {
      answer = join(answer, query(2 * node, left, middle, qleft, qright));
    }
    if(middle < qright) {
      answer = join(answer, query(2 * node + 1, middle + 1, right, qleft, qright));
    }
    return answer;
  }

  int query(int st, int dr) {
    return query(1, 1, n, st, dr).answer;
  }
} aint;

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  int n;
  cin >> n >> s;
  s = "#" + s;
  aint.init(n);
  int q;
  cin >> q;
  while(q--) {
    int st, dr;
    cin >> st >> dr;
    cout << aint.query(st, dr) << "\n";
  }
  return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...