CF 848C

私は良いoierが送り出すする権利があると聞きました。

問題の意味

最初に出現する位置のインデックスを減算することにより、最後の出現位置索引におけるデジタルX [L、R]でデジタルX [L、R]値の定義における長さnの配列を、与えられました

M回与えられたクエリは、各クエリは三つの整数、Bが含まれている、cは次のルールを尋ねました:

Cへの変化、配列の内部要素の場合= 1、B

場合= 2、[B、C]の範囲を求め、すべてのデジタル値

問題解決のためのアイデア

各点と考えることが難しいため、自分の体重と(前駆体と呼ぶことができる)、同じインデックスポイントのレコードは、添え字の2つの値の間の彼の重量差を設けました。

次いで、[L、R]は重みの量はすべての点が[L、R]、及び略であり得る表し見出すことができます。

しかし、我々はすぐに我々はいくつかのより多くを支払うことを発見しました。

すべての前駆体のためのその後の補正[L、R]が[L、R]の重みと点以内。

そして、それは2次元平面上のクエリと長方形のように見えました。

CDQは分割し、征服することができます

``

<ビット/ STDC ++。H>含みます

名前空間stdを使用。
typedefの長い長いLL。
const int型SZ = 7e5 + 527。
HHのstruct {
int型のX、Y、T、ヴァル。
} TMP [SZ]、Q [SZ]。
N INT、M。
int型のTOT、CNT。
int型、X、Y。
LL [SZ]、F [SZ]。
LL ANS [SZ]。
セット S [SZ]。
セット ::イテレータit。
int型のヘッド[SZ]、LST [SZ]。
ボイド更新(int型のx、int型の合計){
ため(; X <= N + 1、X + =(X&( - X)))[X] + =和F。
}
LLクエリ(INT X){
LL RET = 0。
(; X; X - = X&( - X))のためのRET + = F [X]。
RETを返します。
}
ボイドCDQ(int型のL、R INT){
IF(L == R)のリターン;
INT半ば=(L + R)>> 1。
CDQ(L、MID)、CDQ(MID + 1、R)。
INT I = 1、J =ミッド+ 1、K = L-1です。
一方、(I <=ミッド|| jの<= R){
IF(J> R || I <=ミッド&&(Q [i]が.X <[j]は.X Q || Q [i]は.X == Q [J]は.X && Q [i]は.T <Q [J] .T)){
IF(Q [i]が.T)更新(Qを[I]・Y、Q [i]は.val)!。
TMP [++ K] = Q [i]は、
I ++;
}
他{
(Q [J]もし。
int型NUM = ABS(Q [J] .val)。
IF(Q [J] .val> 0)[NUM] + =クエリ(Q [J] .Y)ANS。
他には、[NUM] ANS - =クエリ(Q [J] .Y)。
}
TMP [++ K] = Q [J]。
J ++;
}
}
(!Q [i]が.T)更新した場合(Q [i]が.Y、-q [I] .val);(私は++; iが=半ばを<Iは、Lが= INT)のために
(; I <= R、iはLを= int型私は++)のためにQ [i]は[I] TMPを=。
}
int型のmain(){
scanf関数( "%D%dの"、&N、&M)。
以下のために(INT i = 1; iが<= N; iが++){
scanf関数( "%dを" &[I])。
S [i]は(i)を挿入します。
LST [I] =頭部[I]、ヘッド[I] = I。
Q [++ TOT =(HH){I、LST [i]は、0、I-LST [I]}。
}
ため(INT I = 1; I <= M; ++ I){
scanf関数( "%D%D%D"、およびタイプ、およびX&Y)。

INT P1 = 0、n1は= 0; //は前驱后继
それは= S [X]]見つける(X)。
(!。それ= S [X]])(開始)--it、P1 =であれば 、それ++こと。
もし(!。(++それ)= S [X]]エンド())N1 =
それ。 - それ;
。Sは、[X]は、消去( IT)。Q [++ TOT =(HH){X、LST [x]は、0、LST [X] -x}。
(N1){もし
Q [++ TOT =(HH){N1、-n1} [N1] LST、0、[N1] LST。
[N1] = P1 LST。
Q [++ TOT =(HH){N 1、0、[N1] LST、N1-LST [N1]}。
}
0 = INT P2 = 0、N2;
[X] Yを=。S [X](X)を挿入します。
それはSを= [[X]]見つける(X)。
(!。それ= S [X]])(開始)--it、P2 =であれば
、それ++こと。
もし(!。(++それ)= S [X]]エンド())N2 = *それ。 - それ;
[X] = P2 LST。Q [++ TOT =(HH){X、LST [x]は、0、X-LST [X]}。
IF(N 2)、{
Q [++ TOT =(HH){N2、LST [N2] 0、[N2] LST -N2}。
LST [N2] = xと;
Q [++ TOT =(HH){n2は、0、[N2] LST、N2-LST [N2]}。
}
}
他{
++ CNT。
Q [++ TOT =(HH){X-1、X-1,1、CNT}。
Q [++ TOT =(HH){Y、Y 1、CNT}。
Q [++ TOT =(HH){X-1、Y 1、-cnt}。
Q [++ TOT =(HH){Y、X-1,1、-cnt}。
}
}
、Q [i]が.X ++、Q [i]は.Y ++;(; I <= TOT ++ I I = 1 INT)ため
CDQ(1、TOT)。
printf( "%LLDする\ n"、ANS [I]);のために(; iは= CNTを<I ++はI = 1 INT)
}

おすすめ

転載: www.cnblogs.com/river-flows-in-you/p/11291811.html
おすすめ