MnZn 主席树 65pts+TLE求调
查看原帖
MnZn 主席树 65pts+TLE求调
126972
Kevinx楼主2024/2/23 17:13
#include<bits/stdc++.h>
#define ll int
#define Mid ll mid = (l + r) >> 1
using namespace std;
const int N = 5e5 + 10, M = N * 21;
ll n, m, a[M], tot = 0;
ll rt[M];
struct node{
	ll lc[M], rc[M], val[M];
	inline void build(ll &p, ll l, ll r) {
		p = ++tot;
		val[p] = 0;
		if(l == r) return;
		Mid;
		build(lc[p], l, mid);
		build(rc[p], mid+1, r);
	}
	
	inline void add(ll pre, ll &p, ll l, ll r, ll k) {
		p = ++tot;
		val[p] = val[pre]+1, lc[p] = lc[pre], rc[p] = rc[pre];
		if(l == r) return;
		Mid;
		if(k <= mid) add(lc[pre], lc[p], l, mid, k);
		if(k  > mid) add(rc[pre], rc[p], mid+1, r, k);
	}
	
	inline ll query(ll pre, ll p, ll l, ll r, ll k) {
		if(l == r) return l;
		Mid;
		ll res1 = 0, res2 = 0;
		if((val[lc[p]] - val[lc[pre]]) * 2 > k) res1 = query(lc[pre], lc[p], l, mid, k);
		if((val[rc[p]] - val[rc[pre]]) * 2 > k) res2 = query(rc[pre], rc[p], mid+1, r, k);
		if(res1 != 0 && res1 != -1) return res1;
		if(res2 != 0 && res2 != -1) return res2;
		return -1;
	}
}T;

int main (){
	scanf("%d%d", &n, &m);
	T.build(rt[0], 1, n);
	for(int i = 1; i <= n; i++) {
		ll x;
		scanf("%d", &x);
		T.add(rt[i-1], rt[i], 1, n, x);
	} 
	for(int i = 1; i <= m; i++) {
		ll l, r;
		scanf("%d%d", &l, &r);
		ll res = T.query(rt[l-1], rt[r], 1, n, r-l+1);
		cout << (res == -1 ? 0 : res) << endl;
	} 
	return 0;
}

记录详情

2024/2/23 17:13
加载中...