[luogu] P2617 다이내믹 랭킹

전체 이분법 템플릿, 소위 전체 이분법은 실제로 보존 및 수정 요청하고 절반 범위 ;

트리 나무도 설정할 수 있지만 많은 양의 코드;

사용법 #include <iostream>
#INCLUDE <cstdio>
#INCLUDE <알고리즘>
std 네임 스페이스를 사용하여, N = CONST INT 1E5 + 7]의 typedef 긴 긴 LL;
인라인 INT 읽고 ()
{
	INT (X) = 0, F = 1; CHAR CH = getchar가 ();
	동안 (CH2 <0 || CH> '9') {경우 (CH2 == '-') = -1 F, CH = getchar가 ()}
	동안 (CH2> = 0 && CH <= '9') {(X) = (X << 1) + (X << 3) + (CH ^ 48) = CH getchar가 ()}
	X * F를 반환;
}
구조체 쿼리
{
	INT O, L, R, K, I;
	쿼리 (INT O = 0, = 0에서 만약, 당신이 = 0 R, K = 0가하면 I = 0)
	{this-> O = O; this-> L = 리터; this-> R = R; this-> K = K; this-가> 난 =}
} Q [N << 2] Q1 [N << 2], Q2 [N << 2] INT N, m, C [N], [N] w, 입술 [N];
인라인 INT lowbit INT (X) {복귀, X (- X)}
추가 인라인 공극 (INT의 X, Y INT) {C [I] + = Y (; I <= N + I = lowbit (I) I = INT (X))에 대한}
인라인 INT 합 INT (X) {INT 입술 = 0; 동안 (X) 입술 + C = [X, X- = lowbit (X) 복귀 입술}
해결 인라인 공극 (S INT, INT t, INT의 L, R INT)
{
	경우 (L == R)
	{
		대 (INT I = S; I <= t; I ++)
		경우 (Q [I] .o를 == 2) 입술 [Q [I] .I] = 1;
		반환;
	} INT 중간 = (L +의 연구) >> 1 = 0 CNT1, CNT2 = 0;
	대 (INT I = S; I <= t; I ++)
	{
		경우 (Q [I] .o를 == 1)
		{
			경우 (Q [I] .L <= MID) 추가 (Q [I · I, Q [I] .R) Q1 [CNT1 ++ = Q [I];
			다른 Q2 [++ CNT2 = Q [I];
		}
		그밖에
		{
			INT (X) = SUM (Q [I] .R) -sum (Q [I] .L-1);
			만약 (x> = Q [I] .k) Q1 [CNT1 ++ = Q [I];
			다른 Q [I] .k- = X, Q2 [++ CNT2 = Q [I];
		}
	}
	위한 (INT 난 = 1; I <= CNT1; I ++)
	경우 (Q1 [I] .o를 == 1) 추가 (Q1 [I] .I, -Q1 [I] .R);
	Q1 = [I] [I-1 + (S)]에 대한 Q (I ++; I <= CNT1 INT 난 = 1) 단계;
	Q [S + CNT1 + I-1] = (Q2) [I]의 (; I <= I ++ CNT2 INT 난 = 1) 단계;
	(CNT1)은 (S, S + cnt1-1, L, 미드)를 해결할 수있는 경우;
	(CNT2)를 풀면 (S + CNT1, t, 미드 + 1, R);
}
() 주요 int로
{
	N = M = 1) (판독) (읽기, INT CNT = 0, TOT = 0;
	위한 (INT 난 = 1; I <= N; I ++) Q [++ CNT = 쿼리 (1, w [i]를 판독 = (), 1,0, I);
	위한 (INT 난 = 1; I <= m; I ++)
	{
		숯 CH; CIN >> CH;
		(CH2 == 'Q') Q [++ CNT] .o 인 = 2, Q [CNT] 펜닐 = (판독), Q [CNT] .R = (판독), Q [CNT] .k = 읽으면 () Q [CNT] .I = TOT ++;
		그밖에
		{
			L = INT (판독), R = (판독);
			([L] w (1), - 1,0, l) Q [++ CNT = 조회;
			Q [++ CNT = 쿼리 ([L] w (1) = R, 1,0, l);
		}
	} 해결 (1, CNT, 0,1e9 + 1);
	COUT << 입술 [I] << ENDL 위해 (; I <= I ++ TOT INT 난 = 1) 단계;
	0을 반환;
}

추천

출처www.cnblogs.com/chtomede/p/12082942.html