1の#include <アルゴリズム> 2の#include <cstdioを> 3 使用して 名前空間をSTD。 4のtypedef 長い 長LL。 5 CONST LL N = 1E5 + 10、INF = 0x3f3f3f3f 。 6 LL N、M。 7 LL和[N]、T [N << 2 ]、タグ[N << 2 ]、ANS [N << 2 ]。 8インラインLL LS(LL P){ 戻り P << 1 ;} 9インラインLL RS(LL P){ 戻り P << 1 | 1 ;} 10インラインボイド push_up(LL P){ANS [P] = ANS [LS(P)] + ANS [RS(P)];} 11インラインボイド追加(LL、L、LL R、LL P、LL K){ANS [P ] + = K×(R-L + 1);タグ[P] + = K;} 12 インライン(読み取りLL){ 13 LL X = 0、F = 1。チャー CH = GETCHAR()。 14 一方(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1 ; CH = GETCHAR();} 15 ながら、(CH> = ' 0 '&& CH <= ' 9 ')、X = X * 10 + CH- ' 0 '、CH = GETCHAR()。 16 リターン X * F。 17 } 18インラインボイドスキャン(){ 19 N =(読み取り); M =は(読み取り) 20 のために(iは= LL 1、I <= N; I ++)和[I] = )(読み取ります。 21 } 22 空隙ビルド(LL P、LL、L、LL R){ 23 であれば(L == R){ 24の ANS [P] =和[L]。リターン; 25 } 26 LL半ば=(L + R)>> 1 。 27 ビルド(LS(P)、L、ミッド)。 28 ビルド(RS(P)、ミッド+ 1 、R)。 29 push_up(P)。 30 } 31 空隙push_down(LL、L、LL R、LL P){ 32 LLミッド=(L + R)>> 1 。 33 追加(L、中間、LS(P)、タグ[P])。 34 追加(MID + 1 、R、RS(P)、タグ[P])。 35 タグ[P] = 0 ; 36 } 37 空隙更新(LL CL、LL、CR、LL、L、LL R、LL P、LL K){ 38 であれば(CL <= L && CR> = {r)は 39 (L、R、P、k)を加えます。リターン; 40 } 41 LLミッド=(L + R)>> 1 。 42 push_down(L、R、P)。 43 であれば(CL <= MID)更新(CL、CR、L、中間、LS(P)、K)。 44 であれば(CR> MID)更新(CL、CR、中間+ 1 、R、RS(P)、K)。 45 push_up(P)。 46 } 47 LLクエリ(LL CL、LL、CR、LL、L、LL R、LL P){ 48 LL RES = 0 。 49 であれば(CL <= L && CR> = R)戻りANS [P]。 50 LLミッド=(L + R)>> 1 。 51 push_down(L、R、P)。 52 であれば(CL <= MID)RES + = クエリ(CL、CR、L、中間、LS(P))。 53 であれば(CR> MID)RES + =クエリ(CL、CR、中間+ 1 、R、RS(P))。 54 リターンのres; 55 } 56 INT メイン(){ 57 // freopenは( "testdata.in"、 "R"、STDIN)。 58 // freopenは( "testdata.out"、 "W"、STDOUT); 59の スキャン()。 60 ビルド(1、1 、N) 61 一方(M-- ){ 62 のLL K = read()は、 63 もし(K ==1 ){ 64 のLL L =(読み取り)、R =(読み取り)、= K (読み取り) 65 更新(L、R、1、nは、1 、K)。 66 } 67 他{ 68 のLL L =(読み取り)、R = 読み取り()。 69 のprintf(" %のLLD \ n "、クエリ(L、R、1、nは、1 ))。 70 } 71 } 72 リターン 0 。 73 }