Brakerts
Each time an interval is asked, a segment tree is reconstructed according to the first line of the segment tree in the query interval.
View Code#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define Lson l,m, Rt<<1#define Rson m+1,r,rt<<1|1#define PII pair<int,int>using namespace Std;typedef Long LongLL;Const intN = 200010;int_, N, Q;CharStr[n]; PII sum[n << 2], tmp[n << 2]; PII pushup (PII &l, Pii &r) {PII ans = make_pair (L.first, R.second);intmi = min (l.second, r.first); Ans.first + = R.first-mi; Ans.second + = L.second-mi;returnAns;}voidBuildintLintRintRT) {if(L = = r) {Sum[rt] = Make_pair (str[l] = = ') ', str[l] = = ' (');return; }intm = (L + r) >> 1; Build (Lson); Build (Rson); SUM[RT] = pushup (sum[rt << 1], sum[rt << 1 | 1]);}voidUpdateintPintLintRintRT) {if(L = = r) {Sum[rt].first ^= 1; Sum[rt].second ^= 1;return; }intm = (L + r) >> 1;if(P <= m) update (p, Lson);ElseUpdate (P, Rson); SUM[RT] = pushup (sum[rt << 1], sum[rt << 1 | 1]);}voidQueryintLintRintLintRintRT) {if(l <= L && R <= R) {TMP[RT] = Sum[rt];return; }intm = (L + r) >> 1; Tmp[rt << 1] = tmp[rt << 1 | 1] = make_pair (0, 0);if(l <= m) query (L, R, Lson);if(r > M) query (L, R, Rson); TMP[RT] = pushup (tmp[rt << 1], tmp[rt << 1 | 1]);}intQuery2 (intLintRintKintLintRintRT) {if(Tmp[rt].first + Tmp[rt].second < k)return-1;if(L = = r)returnLintm = (L + r) >> 1;if(R <= m)returnQuery2 (L, R, K, Lson);if(L > m)returnQuery2 (L, R, K, Rson);if(l <= L && R >= m) tmp[rt << 1] = sum[rt << 1];if(L <= m + 1 && r >= R) tmp[rt << 1 | 1] = SUM[RT << 1 | 1];intnum = Tmp[rt << 1].first;if(Tmp[rt << 1].second > tmp[rt << 1 | 1].first) {num + = tmp[rt << 1].second-tmp[rt << 1 | 1].first; }if(k <= num)returnQuery2 (L, R, K, Lson);intnow = K-num; Now + = min (tmp[rt << 1 | 1].first, Tmp[rt << 1].second);returnQuery2 (L, R, now, Rson);}voidSolve () {scanf("%d%d%s", &n, &q, str + 1); Build (1, N, 1);intA, B, C, D; while(q--) {scanf("%d", &a);if(A = = 1) {scanf("%d", &b); Update (b, 1, n, 1); }Else{scanf("%d%d%d", &b, &c, &d); Query (b, C, 1, N, 1);intAns = Query2 (b, C, D, 1, N, 1);printf("%d\n", ans); } }}intMain () {#ifdef LOCAL freopen ("In.txt", "R", stdin); #endif//LOCALCin >> _; while(_--) solve ();return0;}
Brackets (Bestcoder)