50pts求助
查看原帖
50pts求助
708102
bijhla楼主2024/11/7 20:46
#include <bits/stdc++.h>
#define PII pair <int, int>
#define ll long long
#define MP make_pair
#define PB push_back
using namespace std;
constexpr int N = 2e5 + 10, INF = INT_MAX;
int n, a[N], cnt, root[N], m, b[N], rev[N];
char *p1, *p2, buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
inline int read ()
{
	int x = 0, f = 1;
	char ch = nc ();
	while (ch < 48 || ch > 57)
	{
		if (ch == '-') f = -1;
		ch = nc ();
	}
	while (48 <= ch && ch <= 57) x = x * 10 + ch - 48, ch = nc ();
	return x * f;
}
struct tree
{
    int val, ls, rs;   
    #define val(p) t[p].val
    #define ls(p) t[p].ls
    #define rs(p) t[p].rs
} t[N << 5];
int update (int p, int l, int r, int x)
{
    int rt = ++cnt;
    t[rt] = t[p], t[rt].val++;
    if (l == r) return rt;
    int mid = (l + r) >> 1;
    if (x <= mid) ls (rt) = update (ls (p), l, mid, x);
    else rs (rt) = update (rs (p), mid + 1, r, x);
    return rt;
}
int query (int p, int q, int l, int r, int k)
{
    if (l == r) return l;
    int dta = val (ls (q)) - val (ls (p)), mid = (l + r) >> 1;
    if (dta >= k) return query (ls (p), ls (q), l, mid, k);
    else return query (rs (p), rs (q), mid + 1, r, k - dta);
}
signed main()
{
	// freopen ("C:\\Users\\26249\\Downloads\\P3834_6.in", "r", stdin);
	// freopen ("C:\\Users\\26249\\Downloads\\P3834.out", "w", stdout);
    n = read (), m = read ();
    for (int i = 1; i <= n; i++) a[i] = read (), b[i] = a[i];
    sort (a + 1, a + n + 1);
    int K = unique (a + 1, a + n + 1) - a - 1;
    for (int i = 1; i <= K; i++) {int num = lower_bound (a + 1, a + K + 1, b[i]) - a; root[i] = update (root[i - 1], 0, N, num); rev[num] = b[i]; b[i] = num;}
    for (int i = 1; i <= m; i++)
    {
        int l, r, k;
        l = read (), r = read (), k = read ();
        cout << rev[query (root[l - 1], root[r], 0, N, k)] << "\n";
    }
    return 0;
}

2024/11/7 20:46
加载中...