Submission #1341355

#TimeUsernameProblemLanguageResultExecution timeMemory
1341355wurangElection (BOI18_election)C++20
100 / 100
285 ms42636 KiB
#include <bits/stdc++.h>
#define int long long
#define _ 500005
constexpr int inf = 0x3f3f3f3f3f3f3f3f;
using namespace std;
namespace IO {
    const int L=1<<20; char buf[L],*p1,*p2,out[L],*p3=out; 
    #define Gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,L,stdin),p1==p2)?EOF:*p1++)
    #define Pc(x) (p3==out+L&&(fwrite(out,1,L,stdout),p3=out),*p3++=(x))
    struct F{~F(){fwrite(out,1,p3-out,stdout);}}fff;
    template<typename T> inline void rd(T& x){x=0; char c=Gc(); bool f=0; while(!isdigit(c))f^=c=='-',c=Gc();while(isdigit(c))x=x*10+(c^48),c=Gc(); if(f)x=-x;}inline void rd(char& c){do c=Gc();while(isspace(c));}inline void rd(string& s){s=""; char c; rd(c); do s+=c; while(!isspace(c=Gc())&&~c);}template<typename T,typename... A> inline void rd(T& x,A&... a){rd(x),rd(a...);}template<typename T> inline void wt(T x){if(x<0)Pc('-'),x=-x; static int s[45],t=0; do s[++t]=x%10; while(x/=10);while(t)Pc(s[t--]|48);}inline void wt(char c){Pc(c);}inline void wt(const char* s){while(*s)Pc(*s++);}inline void wt(string s){for(char c:s)Pc(c);}template<typename T,typename... A> inline void wt(T x,A... a){wt(x),Pc(sizeof...(a)?' ':'\n'),(wt(a...),0);}
} using namespace IO;
#define rep(i, l, r) for(int i = (l); i <= (r); ++i)
#define urep(i, r, l) for(int i = (r); i >= (l); --i)

int n, a[_];

// ----------------------------------------SEG----------------------------------------

struct node {int sum, pre, suf, ans;}t[_ << 2]; 
inline node add(node L, node R){return node{L.sum + R.sum, max(L.pre, L.sum + R.pre), max(R.suf, R.sum + L.suf), max({L.ans + R.sum, L.sum + R.ans, L.pre + R.suf})};}

#define mid ((l + r) >> 1)
#define ls (p << 1)
#define rs (ls | 1)

void build(int p = 1, int l = 1, int r = n)
{
    if(l == r) return t[p] = node{a[l], max(0ll, a[l]), max(0ll, a[l]), max(0ll, a[l])}, void();
    build(ls, l, mid);
    build(rs, mid + 1, r);
    t[p] = add(t[ls], t[rs]);
}

node query(int ql, int qr, int p = 1, int l = 1, int r = n)
{
    if(ql <= l && r <= qr) return t[p];
    if(qr <= mid) return query(ql, qr, ls, l, mid);
    if(ql > mid) return query(ql, qr, rs, mid + 1, r);
    return add(query(ql, qr, ls, l, mid), query(ql, qr, rs, mid + 1, r));
}

char ch;
int q, l, r;

signed main() 
{
    rd(n);
    rep(i, 1, n) rd(ch), a[i] = (ch == 'C' ? -1 : 1);
    build();
    rd(q);
    while(q--)
        rd(l, r), wt(query(l, r).ans, "\n");
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...