効果:プラスの範囲、最も遠い距離要素の$ X $の全体のクエリー配列。
素晴らしい時間、無脳$ O(n個の\ SQRT {n}はLOGN)$ブロック。
書式#include <iostreamの> の#include <sstream提供> する#include <アルゴリズム> 書式#include <cstdioを> する#include <math.h>の 書式#include <設定> 書式#include <マップ> 書式#include <キュー> の#include <string>に する#include < string.hの> の#include <ビットセット> の#define REP(I、N)のために(INT iは=; I <= N; ++ I) の#define PER(I、N)のための(iはint型= N; I> = A; - I) の#defineのHRのputchar(10) の#define PB一back の#define LC(O << 1) の#define RC(LC | 1) の#define中間((L + R)>> 1) の#define LS LC、L、中 の#define RSのRC、ミッド+ 1、R用 の#defineは、最初のx の#define yの第二 のstd :: IOS IOの#defineを::sync_with_stdio(偽) の#define ENDL '\ n'は #define DB(A)({REP(__ I、1、n)はCOUT << [__ I] <<」「;}時間) 名前空間stdを使用。 typedefの長い長いLL。 typedefのペア<int型、int型> PII。 CONST int型P = 1E9 + 7、P2 = 998244353、INF = 0x3f3f3f3f。 LLのGCD(-1,11,11- b)は{戻りB GCD(B、%のB):;} のLL qpow(-1,11,11- n)で{LLのR = 1%P;(%= Pのために、N ; = *%P、N >> = 1)であれば(N - 1)R = R *%のP、リターンR;} ?LL INV(LL X){X <= 1を返す:INV(P%以下X)*(PP / X)%P;} インラインint型RD(){int型のx = 0; CHAR P = GETCHAR();一方、(P < '0' || P> '9')p = GETCHAR() ;一方、(P> = '0' && P <= '9')、X = X * 10 + P-'0' 、P = GETCHAR();戻りX;} //ヘッド のconst int型N = 1E6 + 10。 INTのN、M、SQN、[N]。 INT BLO [N]、L [N]、R [N]、タグ[N]。 ベクター<INT> G [N]。 REP(I、L [ID]、R [ID])[I] =分(INF、[I] +タグ[ID])。 REP(I、L、R)[I] =分(INF、[I] + V)。 G [ID] .clear()、タグ[ID] = 0; REP(I、L [ID]、R [ID])G [ID] .pb([I])。 ソート(G [ID] .begin()、G [ID] .END())。 } ボイド更新(int型のL、R INT、INT V)、{ IF(BLO [L] == BLO [R])を構築(L、R、V、BLO [L])。 他{ (L、R [BLO [L]、V、BLO [L])を構築します。 (L [BLO [R]、R、V、BLO [R])を構築します。 REP(I、BLO [L] + 1、BLO [R] -1)タグ[I] =分(INF、タグ[I] + V)。 } } int型クエリ(INT X)、{ INT QR = 0、QL = 1。 REP(I、1、BLO [N]){ オートT = LOWER_BOUND(G [i]が.begin()、G [i]は.END()、Xタグ[I])。 IF(!T = G [i]が.END()&& *さt == X-タグ[I]){ (iは0,0,0)を構築します。 REP(J、L [i]は、R [i])とIF([J] == X){ R [BLO [I] = BLO [I] * SQN。 QL = J; ブレーク; } ブレーク; } } PER(I、1、BLO [N]){ オートT = UPPER_BOUND(G [i]が.begin()、G [i]は.END()、Xタグ[I])。 IF(!T = G [i]が.begin()&& *( - T)== X-タグ[I]){ (私を0,0,0)を構築します。 PER(J、L [i]は、R [i])とIF([J] == X){ QR = J。ブレーク; } ブレーク; } } 戻りQR-QL。 } int型のmain(){ scanf関数( "%D%dの"、&N、&M)。 SQN = POW(N、0.44)。 REP(I、1、N){ scanf関数( "%dの"、A + I)。 BLO [I] =(I-1)/ SQN + 1。 G [BLO [I] PB([I])。 L [BLO [I] =(BLO [I] -1)* SQN + 1。 REP(I、1、BLO [N])ソート(G [i]が.begin()、G [i]は.END())。 } 一方、(M--){ int型OP、L、R、X、 scanf関数( "%のD"、&OP)。 IF(OP == 1){ scanf関数( "%D%D%D"、&L&R&X)。 アップデート(L、R、X)。 } 他{ scanf関数( "%のD"、&x)は、 printf( "%d個の\ n"、クエリ(X)); } } }