求卡常
  • 板块灌水区
  • 楼主dvsfanjo
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/10/8 20:10
  • 上次更新2024/10/8 21:53:33
查看原帖
求卡常
1198462
dvsfanjo楼主2024/10/8 20:10
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxn = 5e4 + 5, as = 1e7;
const ll inf = 2147483647;
ll n, m, op, x, y, k, a[maxn], si_ze, idx;
ll sz[as], l[as], r[as], val[as], key[as];
struct FHQ_Treap {
	ll root;
	inline ll New(ll v) {
		idx++;
		sz[idx] = 1;
		val[idx] = v;
		key[idx] = rand();
		return idx;
	}
	void Update(ll u) {
		sz[u] = sz[l[u]] + sz[r[u]] + 1;
		return;
	}
	void Split(ll u, ll v, ll &x, ll &y) {
		if (!u) {
			x = y = 0;
			return;
		}
		if (val[u] <= v) {
			x = u;
			Split(r[u], v, r[u], y);
		} else {
			y = u;
			Split(l[u], v, x, l[u]);
		}
		Update(u);
		return;
	}
	inline ll Merge(ll x, ll y) {
		if (!x || !y)
			return x | y;
		if (key[x] < key[y]) {
			r[x] = Merge(r[x], y);
			Update(x);
			return x;
		} else {
			l[y] = Merge(x, l[y]);
			Update(y);
			return y;
		}
	}
	void Insert(ll v) 	{
		ll x, y, z;
		z = New(v);
		Split(root, v, x, y);
		root = Merge(Merge(x, z), y);
		return;
	}
	void Delete(ll v) {
		ll x, y, z;
		Split(root, v, x, y);
		Split(x, v - 1, x, z);
		z = Merge(l[z], r[z]);
		root = Merge(Merge(x, z), y);
		return;
	}
	inline ll Rank(ll v) {
		ll x, y, ans;
		Split(root, v - 1, x, y);
		ans = sz[x] + 1;
		root = Merge(x, y);
		return ans;
	}
	inline ll K_th(ll u, ll k) 	{
		if (!u)
			return 1;
		if (sz[l[u]] + 1 == k)
			return val[u];
		if (k <= sz[l[u]])
			return K_th(l[u], k);
		return K_th(r[u], k - sz[l[u]] - 1);
	}
	inline ll Pre(ll v) 	{
		ll x, y, ans;
		if (K_th(root, 1) >= v)
			return -inf;
		Split(root, v - 1, x, y);
		ans = K_th(x, sz[x]);
		root = Merge(x, y);
		return ans;
	}
	inline ll Suc(ll v) 	{
		ll x, y, ans;
		if (K_th(root, sz[root]) <= v)
			return inf;
		Split(root, v, x, y);
		ans = K_th(y, 1);
		root = Merge(x, y);
		return ans;
	}
	void Build(ll l, ll r) {
		for (int i = l; i <= r; ++i)
			Insert(a[i]);
		return;
	}
};
struct SegTree {
	FHQ_Treap t[maxn << 2];
	void build(ll l, ll r, ll i) {
		t[i].Build(l, r);
		if (l == r)
			return;
		ll mid = (l + r) >> 1;
		build(l, mid, i << 1);
		build(mid + 1, r, i << 1 | 1);
		return;
	}
	void update(ll l, ll r, ll i, ll w, ll k) {
		t[i].Delete(a[w]);
		t[i].Insert(k);
		if (l == r && l == w) {
			a[w] = k;
			return;
		}
		ll mid = (l + r) >> 1;
		if (w <= mid)
			update(l, mid, i << 1, w, k);
		else
			update(mid + 1, r, i << 1 | 1, w, k);
		return;
	}
	ll rank(ll l, ll r, ll i, ll a, ll b, ll k) {
		if (a <= l && r <= b)
			return t[i].Rank(k) - 1;
		ll mid = (l + r) >> 1, ans = 0;
		if (a <= mid)
			ans += rank(l, mid, i << 1, a, b, k);
		if (mid < b)
			ans += rank(mid + 1, r, i << 1 | 1, a, b, k);
		return ans;
	}
	inline ll k_th(ll l, ll r, ll k) {
		ll x = 0, y = 1e9, ans = - 1;
		while (x <= y) {
			ll mid = (x + y) >> 1;
			if (rank(1, n, 1, l, r, mid) < k)
			{
				ans = mid;
				x = mid + 1;
			}
			else
				y = mid - 1;
		}
		return ans;
	}
	ll pre(ll l, ll r, ll i, ll a, ll b, ll k) {
		if (r < a || l > b)
			return -inf;
		if (a <= l && r <= b)
			return t[i].Pre(k);
		ll mid = (l + r) >> 1;
		return max(pre(l, mid, i << 1, a, b, k), pre(mid + 1, r, i << 1 | 1, a, b, k));
	}
	ll suc(ll l, ll r, ll i, ll a, ll b, ll k) {
		if (r < a || l > b)
			return inf;
		if (a <= l && r <= b)
			return t[i].Suc(k);	
		ll mid = (l + r) >> 1;
		return min(suc(l, mid, i << 1, a, b, k), suc(mid + 1, r, i << 1 | 1, a, b, k));
	}
} tree;
inline ll read()
{
    ll x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline void write(ll x){
    if(x<0){
        putchar('-');
        x=-x;
    }
    ll y=10,len=1;
    while(y<=x){
        y=(y<<3)+(y<<1);
        len++;
    }
    while(len--){
        y/=10;
        putchar(x/y+48);
        x%=y;
    }
}
int main() {
	n = read();
	m = read();
	for (int i = 1; i <= n; ++i)
		a[i] = read();
	tree.build(1, n, 1);
	while  (m--) {
		op = read();
		switch (op) {
            case 1 : {
            	x = read();
            	y = read();
            	k = read();
                write(tree.rank(1, n, 1, x, y, k) + 1);
				putchar('\n');
                break;   
            }
            case 2 : {
            	x = read();
            	y = read();
            	k = read();
                write(tree.k_th(x, y, k)); 
				putchar('\n');  
                break;  
            }
            case 3 : {
            	x = read();
            	y = read();
                tree.update(1, n, 1, x, y);
                break;
            }
            case 4 : {
            	x = read();
            	y = read();
            	k = read();
                write(tree.pre(1, n, 1, x, y, k)); 
				putchar('\n');
                break;
            }
            case 5 : {
            	x = read();
            	y = read();
            	k = read();
                write(tree.suc(1, n, 1, x, y, k)); 
				putchar('\n');    
                break;
            }
        }
	}
	return 0;
}

link

2024/10/8 20:10
加载中...