제출 #1328780

#제출 시각아이디문제언어결과실행 시간메모리
1328780model_codeTornjevi (COCI25_tornjevi)C++20
110 / 110
126 ms9448 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5;
const int OFF = 1 << 18;

struct Node {
	int pref = 0, suf = 0;
	int maks = 0, sum = 0;
	
	void set(int value) {
		pref = max(pref, value);
		suf = max(suf, value);
		maks = max(maks, value);
		sum = value;
	}
} tour[OFF][2], e;

Node merge(const Node& L, const Node& R) {
	Node ret;
	ret.pref = max(L.pref, L.sum + R.pref);
	ret.suf = max(R.suf, L.suf + R.sum);
	ret.maks = max(L.maks, R.maks);
	ret.maks = max(ret.maks, L.suf + R.pref);
	ret.sum = L.sum + R.sum;
	return ret;
}

int value(char c, bool flag) {
	if ((c == 'P') ^ flag) return 1;
	return -1; 
}

int n, q;
string s;

void con(int x, int l, int r, bool flag) {
	if (l == r) {
		tour[x][flag].set(value(s[l], flag));
	} else {
		int mid = (l + r) >> 1;
		con(x * 2 + 1, l, mid, flag);
		con(x * 2 + 2, mid + 1, r, flag);
		tour[x][flag] = merge(tour[x * 2 + 1][flag], tour[x * 2 + 2][flag]);
	}
}

Node get(int x, int l, int r, int ql, int qr, bool flag) {
	if (ql <= l && r <= qr) return tour[x][flag];
	if (ql > r || l > qr) return e;
	
	int mid = (l + r) >> 1;
	
	return merge(
		get(x * 2 + 1, l, mid, ql, qr, flag),
		get(x * 2 + 2, mid + 1, r, ql, qr, flag)
	);
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(0);
	cin >> n >> q;
	cin >> s;
	
	con(0, 0, n - 1, 0);
	con(0, 0, n - 1, 1);
	
	while (q--) {
		int l, r;
		cin >> l >> r, --l, --r;
		Node X = get(0, 0, n - 1, l, r, 0);
		Node Y = get(0, 0, n - 1, l, r, 1);
		cout << max(X.maks, Y.maks) << "\n";
	}
	
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...