/ * すべての可能なケースを除外し、残りは可能である 数が同じ数1ない 2、逆順に任意の同等が、交換することができる任意の種類の範囲は 、次に1からB n本の走査アレイに[I] jは位置Iに切り換えられbの位置はどこの値が配列に等しくてもよいか否かを判定、判定間隔に相当する[I、J] [i]は、この数は、後に判定されていないbは<複数ある場合再び必要とされるであろう、それは無限大に変更され たクラスの部分的順序付けのために同様の問題が最小ダイナミックレンジを維持するために、セグメントツリーを確立することができる * / の#includeを <ビット/ STDC ++ H.> の#include <キュー> 使用して 名前空間STD; の#define MAXN 300005 の#define INF 0x3f3f3f3f INT A [MAXN]、B [MAXN]、TA [MAXN]、TB [MAXN]、N-; の#define LSONのL、M、RT << 1。 の#define rson 1 + M、R&LT、RT <。 。<1 | 1つの 整数分[MAXN << 2 ]; 無効(押し上げをINT RT){ 分[RT] =分(分[RT << 1 ]、分[RT << 1 | 1 ])。 } ボイドビルド(int型 L、INT R、INT RT){ 場合(L == R){ 最小[RT] = [L]を、 返します。 } INT M = 1 + rを>> 1 。 (LSON)を構築します。 (rson)を構築します。 突き上げ(RT)。 } ボイド更新(int型の POS、INTヴァル、int型の L、INT R、INT RT){ 場合(L ==R){ 最小[RT] = ヴァル。 返します。 } INT M = 1 + rを>> 1 。 もし(POS <= m)の更新(POS、ヴァル、LSON)。 他の更新(POS、ヴァル、rson)。 突き上げ(RT)。 } int型の照会(int型 L、INT R、int型の L、INT R、INT RT){ 場合(L <= 1 && R> = r)は戻り[RT]分; INT、M = L + R >> 1、RES = 0x3f3f3f3f 。 もし(L <= M)RES =分(RES、クエリ(L、R、LSON))。 もし(R> M)RES = 分(RES、クエリ(L、R、rson))。 リターンのres; } キュー < INT > Q [MAXN]。 INT のmain(){ int型のT。 cinを >> トン。 一方、(t-- ){ CIN >> N。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ CINは >> [I]、Taは[I] = [I]。 一方、(Q [I]サイズ())Q [i]は]ポップ()。 } のために(int型のI =1 ; iが<= N; i)は、CIN >> B [i]は、TB [I] =用++ B [i]は、 ソート(TA + 1、TA + 1個の + N)、ソート(TB、TB + 1 + N)。 int型フラグ= 0 。 以下のために(int型 I = 1 iは++; iが<= N ) であれば(TA [I] = TB [I]!)フラグ= 1 。 もし(!フラグ){ 構築(1、N 1 )。 以下のために(int型 i = 1 ; iが<= N; iは++ ) Q [[I]を押す(I)。 にとって(int型 i = 1 ; iが<= N; iが++ ){ int型の POS = 。Qフロント()[I] B]。 Q [i]はB]ポップ()。 INT TMP =クエリ(1、POS、1、nは、1 )。 アップデート(POS、INF、1、nは、1 )。 もし(TMP <B [i])とフラグ= 1 。 } } もし(フラグ)プット(" NO " )。 他のプット(" YES " ); } }