分块Wa 0分 求助
查看原帖
分块Wa 0分 求助
748239
OIbishop楼主2023/2/28 20:45
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n , T , tt , x[N] , c[N] , pos[N] , L[N] , R[N];

inline void build_tree (int o)
{
	for (register int i = L[o]; i <= R[o]; i++)
		c[i] = x[i];
	sort (c + L[o] , c + R[o] + 1);
}

inline void modfy (int u , int v)
{
	x[u] = v;
	build_tree (pos[u]);
}

inline int check (int y , int val)
{
	int l = L[y] , r = R[y] , mid , ans = -1;
	while (l <= r)
	{
		mid = l + r >> 1;
		if (c[mid] <= val)
			ans = mid , l = mid + 1;
		else r = mid - 1;
	}
	return (~ans) ? ans - L[y] + 1 : 0;
}

inline int ask (int l , int r , int k)
{
	int ll = 0 , rr = 1e9 , mid , ans = 1 , p = pos[l] , q = pos[r] , cnt = 0;
	while (ll <= rr)
	{
		mid = ll + rr >> 1 , cnt = 0;
		if (p == q)
			for (register int i = l; i <= r; i++)
				if (x[i] <= mid) ++cnt;
		else 
		{
			for (register int i = l; i <= R[p]; i++)
				if (x[i] <= mid) ++cnt;
			for (register int i = L[q]; i <= r; i++)
				if (x[i] <= mid) ++cnt;
			for (register int i = p + 1; i <= q - 1; i++)
				cnt += check (i , mid);
		}
		if (cnt >= k)
			ans = mid , rr = mid - 1;
		else ll = mid + 1;
	}
	return ans;
}

signed main ()
{
	cin >> n >> T;
	for (register int i = 1; i <= n; i++) cin >> x[i];
	tt = sqrt (n);
	for (register int i = 1; i <= tt; i++)
		L[i] = R[i - 1] + 1 , R[i] = i * tt;
	if (R[tt] < n) tt++ , L[tt] = R[tt - 1] + 1 , R[tt] = n;
	for (register int i = 1; i <= tt; i++)
	{
		for (register int j = L[i]; j <= R[i]; j++)
			pos[j] = i; 
		build_tree (i);
	}
	while (T--)
	{
		int l , r , k;
		char opt;
		cin >> opt;
		if (opt == 'C')
		{
			cin >> l >> r;
			modfy (l , r);
		}
		else 
		{
			cin >> l >> r >> k;
			cout << ask (l , r , k) << "\n";
		}
	}
	return 0;
}
2023/2/28 20:45
加载中...