https://codeforces.com/contest/1288/problem/E
問題の意味:情報のNは、シーケンスの開始は各操作は、シフト後の後上部、付加情報となり、1-N、Mの操作であります
上から最小および最大距離から各情報を確認して下さい。
溶液は、単一点フェンウィックツリーを使用して、間隔のn + m個の長さを拡大し、接頭辞と需要、各位置のレコードを有する別の配列を更新します。
//#<ビット/ STDC ++。H>含みます 書式#include <cstdioを> 書式#include <CStringの> 書式#include <cmath> 書式#include <アルゴリズム> 書式#include <iostreamの> 書式#include <cstdioを> 書式#include <文字列> 書式#include <stdio.hに> 書式#include <キュー> 書式#include <スタック> 書式#include <マップ> 書式#include <セット> 書式#include <string.hの> 書式#include <ベクトル> #define ME(x、y)はmemsetの(X、Y、はsizeof(x))を #define SF(N)のscanf( "%d個"、&N) #define担当者(I、N)のために(INT I = 0; iは<N; I ++) #define INF 0x3f3f3f3f #defineモッズ十億七 #define PIのACOS(-1) 名前空間stdを使用。 長い長いLLのtypedef。 INT C [600009]。 あなたがいない[300 009]、その[300 009]。 int型リットル; INT年[300009] int型lowerbit(int型x)は、 { リターンX&( - x)は、 } 無効アドオン(int型のx、int型のval) { (int型I = X; I <= L、I + = lowerbit(I))のために { C [I] + =ヴァル。 } } int型getsum(int型x)は、 { INT年= 0; ( - = lowerbit(I)I; I> = 1のint I = X)のために { 年+ = C [i]は、 } ANSを返します。 } メインint型() { 整数N、M。 scanf関数( "%D%D"、&N、&M)。 L = N + M。 (I ++; I <= N I = 1の整数)のために { ANS [I] = I + M。 I [I] = [I] = I。 追加(I + M、1)。 } (I ++; I <M I = 0の整数)のために { int型のx; scanf関数( "%のD"、&x)は、 私の[X] = 1; MA [X] = MAX(MA〔X〕、getsum(ANS [X])); //毎回クエリから移動する前に。 (ANS [x]は、-1)を追加。 ANS [X] = M - I; //更新場所 アド(ANS [x]は、1)。 } //上に何の情報がなくてもよいし、再度スクリーニング必要とするため(; iは<= N I ++ INT I 1 =) { MA [I] = MAX(MA [I]、getsum(ANS [I]))。 } (I ++; I <= N I = 1の整数)のために { COUT << MI [I] << "" << MA [I] << ENDL。 } 0を返します。 }