タイトル説明
それは、列の数にはよく知られている場合は、次の2つの操作を実行する必要があります。
各セクションに加えて、いくつかの数x 1
2.数の値を取得
入出力フォーマット
入力フォーマット:
最初の行は、2つの整数N、Mを含み、それぞれの列と操作の回数の合計数の数を表します。
数が初期値のIアイテムのi番目の列を表す第2のラインは、スペースで区切られたN個の整数を含みます。
次のMラインが2又は4の整数を含んでいる次のように操作を示します。
操作1:フォーマット:1 XYK意味:区間[X、Y]各数k個プラス
操作2:フォーマット:2 xは意味:x値出力の数
出力フォーマット:
出力は、すべて2の演算結果である線の整数を含んでいます。
サンプル入力と出力
説明
時間の制約:1000ミリ秒、128M
データスケール:
N <= 8、M <= 10:データの30%を
N <= 10000、M <= 10000:データの70%を
データの100%まで:N <= 500000、M <= 500000
サンプル説明:
したがって、出力は6,10です
分析:
これは、テンプレートの問題EMです。。。。説明されていません。。。コード。。。
コード:
1の#include <cstdioを> 2の#include <CStringの> 3の#include <cmath> 4の#include <iostreamの> 5の#include <アルゴリズム> 6 使って 名前空間STD。 7 int型N、M。 8 長い 長い和[ 555555 ]。 9 ボイド(追加のint X、長い 長いY){ 10 ながら(X <= N){ 11 和[X] + = Y。 12 X + = X& - X。 13 } 14 リターン; 15 } 16 長い 長い(ASK INT X){ 17の 長い 長のANS = 0 。 18 一方(X> = 1 ){ 19の ANS + = 和[X]。 20 のx = X& - X。 21 } 22の リターンANS。 23 } 24 長い 長FR(){ 25 チャー C = GETCHAR()。長い 長い ANS = 0 ; ブールフラグ= 1 。 26 一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ')フラグ= 0、C = GETCHAR();} 27 ながら(> = C ' 0 ' && C <= ' 9 '){ANS =(ANS << 1)+(ANS << 3)+(C ^ 48)、C = GETCHAR();} 28 であれば(フラグ)リターン ANS。戻る - ANS; 長いA、B、C、D。 32 のscanf(" %D%dの"、&N、&M)。 33 のために(int型 i = 1 ; iが<= N; iが++ ){ 34 A = FR()。 35 追加(I、A)、追加(I + 1、 - A)。 36 } 37 ながら(M-- ){ 38 A = FR()。 39 であれば(== 1 ){ 40 B = frの()、C =用のFR()、Dは=のFR()。 41 追加(B、D)、追加(C + 1、 - D)。 42 } 43 であれば(== 2 ){ 44 B =のFR()。 45 のprintf(" %LLDする\ n " 、尋ねる(B))。 46 } 47 } 48 リターン 0 。 49 }