fork(1) download
#include<iostream>
#include<algorithm>
#include<fstream>
#include<climits>
#include<iomanip>
#include<vector>
#define fr(i, zz, zzz) for (int i = zz; i <= zzz; i++)
#define ll long long
#define pii pair<int, int>
#define frr(i, zz, zzz) for (int i = zz; i >= zzz; i--)
#define full(asdf) memset(asdf, 0, sizeof(asdf))
#define st first
#define nd second
#define IOS ios_base::sync_with_stdio(0);   cin.tie(0); cout.tie(0);
using namespace std;
const int N = 1E5 + 10;
fstream f, g;
int n, Q, k, val;
pii a[N];
int cnt = 0, mx = 0;
pii vmax[N];

bool cmp (pii a, pii b) {
	return a.st < b.st || (a.st == b.st && a.nd > b.nd);
}
void open(string s) {
	string in = s + ".INP", out = s + ".OUT";
	f.open(in, ios::in);
	g.open(out, ios::out);
}
void close() {
	f.close();
	g.close();
}

void input() {
	f >> n >> Q;
	fr(i, 1, n)
		f >> a[i].st;
}

int binary() {
	int l = 0, r = k;
	while ( l <= r) {
		int m = (l + r) >> 1;
		if (vmax[m].st < val)
			l = m + 1;
		else if (vmax[m].st >= val)
			r = m - 1;
	}
	return l;
}

void pre_solve() {
	int l[N], r[N];
	fr(i, 1, n) {
		l[i] = i - 1;
		while(l[i] > 0 && a[l[i]].st <= a[i].st)
			l[i] = l[l[i]];
		
	}
	frr(i, n, 1) {
		r[i] = i + 1;
		while (r[i] <= n && a[r[i]].st <= a[i].st)
			r[i] = r[r[i]];
	}
	
	fr(i, 1, n) 
		a[i].nd = r[i] - l[i] - 1;

	sort(a+1, a+n+1, cmp);
	cnt = a[1].nd;
	fr(i, 1, n) {
		if (a[i].st == a[i+1].st)
			cnt = max({cnt, a[i].nd, a[i+1].nd});
		else {
			vmax[++k] = {a[i].st, cnt};
			cnt = a[i+1].nd;
		}
	}
	int res = 0;
	fr(i, 1, k)
		vmax[i].nd = max(vmax[i - 1].nd, vmax[i].nd);
//	fr(i, 1, k)
//		cout << vmax[i].st << " " << vmax[i].nd << "\n";
	
}

int solve() {
	int m = binary();
	if (vmax[m].st > val)
		--m;
//	cout << vmax[m] << "\n";
	return vmax[m].nd;
}

int main () {
	IOS
	open("CPACK");
	input();
	pre_solve();
	int res;
	vmax[k+1].st = 2000000000;
	while (Q--) {
		f >> val;
		g << solve() << "\n";
	}
	close();
}
Success #stdin #stdout 0s 5304KB
stdin
Standard input is empty
stdout
Standard output is empty