제출 #1343903

#제출 시각아이디문제언어결과실행 시간메모리
1343903killerzaluuElection (BOI18_election)C++20
82 / 100
49 ms9684 KiB
#include <bits/stdc++.h>
using namespace std;

struct node {
  long long sum, pref, suff, sub;
};

long long a[200100], n;
node seg[800100];

node merge(node A, node B) {
  node C;
  C.sum=A.sum+B.sum;
  C.pref=min(A.pref, A.sum+B.pref);
  C.suff=min(B.suff, B.sum+A.suff);
  C.sub=min({A.sub, B.sub, A.suff+B.pref});
  return C;
}

void build(long long v, long long l, long long r) {
  if(l==r) {
    seg[v]={a[l], min(0LL, a[l]), min(0LL, a[l]), min(0LL, a[l])};
    return;
  }
  long long mid=(l+r)/2;
  build(2*v, l, mid);
  build(2*v+1, mid+1, r);
  seg[v]=merge(seg[2*v], seg[2*v+1]);
}

node query(long long v, long long l, long long r, long long a, long long b) {
  if(l==a && r==b) {
    return seg[v];
  }
  long long mid=(l+r)/2;
  if(b<=mid) return query(2*v, l, mid, a, b);
  if(a>mid) return query(2*v+1, mid+1, r, a, b);
  return merge(query(2*v, l, mid, a, mid), query(2*v+1, mid+1, r, mid+1, b));
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  long long q, i;
  cin>>n;

  string s;
  cin>>s;

  for(i=1; i<=n; i++) {
    if(s[i-1]=='C') a[i]=-1;
    else a[i]=1;
  }

  build(1, 1, n);

  cin>>q;
  while(q--) {
    long long l, r;
    cin>>l>>r;
    node C=query(1, 1, n, l, r);
    cout<<C.sum-C.sub<<"\n";
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...