主席树做法求教,wa9和wa10
查看原帖
主席树做法求教,wa9和wa10
103226
BeautifulWater楼主2022/4/1 21:09
#include <bits/stdc++.h>
#define mid (l + r >> 1)
#define ll long long
#define ull unsigned long long
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define MAX 1000005
#define MOD 1000000007
#define FI  first
#define SE  second
#define PII pair<int,int>
#define PB  push_back
#define de(x) cout<<"de : "<<x<<endl;
using namespace std;
const int N = 4E6+500,M = 6E5+10;
int n,m,id[N],a[N],sum[N];
vector<int > vec;

int tot,VER[N],L[N],R[N];
int inline build(int l,int r)
{
	int rt = ++tot;
	if(l<r) 
	{
		L[rt] = build(l,mid);
		R[rt] = build(mid+1,r);
	}
	return rt;
}

int inline update(int pre,int l,int r,int x)
{
	int rt = ++tot; 
	L[rt] = L[pre];
	R[rt] = R[pre];
	sum[rt] = sum[pre] + 1;
	if(l<r)
	{
		if(x<=mid) L[rt] = update(L[pre],l,mid,x);
		else R[rt] = update(R[pre],mid+1,r,x);
	}
	return rt;
}

int inline query(int ver1,int ver2,int l,int r,int k)
{
	if(l==r) return l;
    int d = sum[L[ver2]]-sum[L[ver1]];
	if(k<=d) return query(L[ver1],L[ver2],l,mid,k);	
    return query(R[ver1],R[ver2],mid+1,r,k-d);
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    repd(i,1,n)
    {
    	cin>>a[i];
    	vec.PB(a[i]);
	}
	sort(vec.begin(),vec.end());
	vec.erase(unique(vec.begin(),vec.end()),vec.end());
    int len = vec.size();
	repd(i,1,n) id[i] = lower_bound(vec.begin(),vec.end(),a[i]) - vec.begin();	
	VER[0]=build(0,len-1);//建立起一棵空树,代表的是总的值域范围 
	repd(i,1,n)
	    VER[i] = update(VER[i-1],0,len-1,id[i]);
	repd(i,1,m)
    {
    	int le,ri,kk;
    	cin>>le>>ri>>kk;
    	cout<<vec[query(VER[le-1],VER[ri],0,len-1,kk)]<<endl;
	}
	return 0;
}

2022/4/1 21:09
加载中...