$ \ 100%の$のデータについては、$1≤n、m≤1e6\ \ 0 \1≤l_i、r_i≤n$ \ <= X_I、Y_I <20170927 \ \
$ソリューション:$
私は質問を理解していませんでした。以降、モーメントの一般的な理解は、x及びyは2つのパラメータを有する、いわゆる2次元のベクトルvです。その$ \ $回はクロス積、すなわち$(X_I y_j-X - jがY_I)$です。
そこで問題は、$ \和を求めて、各照会間隔$ [L、R] $のために、あなたのxとy配列の配列を与えることを意図している\限界_ {Lの\の当量iが<J \の当量のR}(x_iy_j-x_jy_i) ^ 2 $。修理と。
点の対あまりにも面倒で、単一のポイントに柿を試してみてください。
第1分割広場:
$の\和\制限X_I ^ 2y_j ^ 2-2x_ix_jy_iy_j + X - jが^ 2y_i ^ 2 $ _ {iがj個の\当量Rを<Lの\の当量}
各点を通って各点にかなりの貢献でカウントしました。そう:
$ \和\ limits_ {I = L} ^ R X_I ^ 2 \和\限界_ {i = L} ^ R Y_I ^ 2-(\和\ limits_ {I = L} ^ R x_iy_i)^ 2 $
次いで、3つのオープンフェンウィックツリーは、別々に$ {X_I} ^ 2、{Y_I} ^ 2、X_I Y_I $缶を維持しました。
書式#include <cstdioを> する#include <iostreamの> の#include <CStringの> 名前空間stdを使用。 #define PA対<-1,11,11-> のtypedef長い長LL。 constのLL MOD = 20170927; LL読み出す() { int型のx = 0、F = 1;チャーCH = GETCHAR()。 (!isdigit(CH))、一方{IF(CH == ' - ')は、f = -1; CH = GETCHAR();} ながら(isdigit(CH))X = X * 10 + CH-'0' 、CH = GETCHAR()。 x * Fを返します。 } のconst int型N = 1E6 + 5。 N INT、M。 LL C [3] [N]。 PAのV [N]。 INTポンド(INT X){X&-x返す;} ボイド追加(INT X、LLヴァル、int型のID) { ため(; X <= Nであり、X + = LB(x))を C [ID] [X] + =ヴァル、(C [ID] [X] + = MOD)%= MOD。 } LLクエリ(int型のx、int型のID) LLのRES = 0。 (; X; X- = LB(X))のために (RES + = C [ID] [X])%= MOD。 リターン(RES + MOD)%のMOD。 } (int型L、int型のR、int型のID)尋ねるちゃう { リターン(クエリ(R、ID)-query(L-1、ID)+ MOD)%MOD。 } )(INTメイン { N =()を読み出し、M =)(読み取ります。 以下のために(INT i = 1; iが<= N; iは++) { V [i]が1次回読み取り=()、V [i]は.second =読み取ります(); 追加(I、V [i]は1次回* V [i]が1次回、0); 追加(I、V [i]は.second * V [i]が.second、1)。 追加(I、V [i]は1次回* V [i]の.second、2)。 } 一方(M--) { (読み取ら= OPをINT)。 (OP == 1)場合は { int型のposが=読み取ります(); LL X =読み取る()、yは読み取ら=(); 追加(POSにおいて、X * XV [POS] 1次回* V [POS] 1次回、0); 追加(POS、Y軸* YV [POS] .second * V [POS] .second、1)。 追加(POSにおいて、X * YV [POS] 1次回* V [POS] .second、2)。 V [POSは] = xを1次回; V [POS] .second = Y。 } IF(OP == 2) { (読み取らINT 1 =)、R =リード()。 LLのRES =を尋ねる(L、R、0)*尋ねる(L、R、1)%のMOD、RES1 =尋ねる(L、R、2)。 RESの=(RES-(RES1 * RES1の%のMOD)+ MOD)%MOD。 printf( "%LLDする\ n"、RES)。 } } 0を返します。 }