求助,静态可持久化线段树!全RE!
查看原帖
求助,静态可持久化线段树!全RE!
245391
Chris_pan楼主2022/1/14 21:02
#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int N(200010);

ll n,m;

struct edge{
	int a,b,lson,rson,sum;
}Tree[N << 5];

int a[N << 5],b[N << 5],Root[N << 5];
int cnt,now;

void Build(int &node,int a,int b){
	node = ++cnt;
	Tree[node].a = a;Tree[node].b = b; 
	if (a == b) return ;
	ll mid(a + b >> 1); 
	Build(Tree[node].lson,a,mid);
	Build(Tree[node].rson,mid + 1,b);
}

void Insert(int pre,int &pos){
	pos = ++cnt;
	Tree[pos].lson = Tree[pre].lson;Tree[pos].rson = Tree[pre].rson;
	Tree[pos].a = Tree[pre].a;Tree[pos].b = Tree[pre].b;
	Tree[pos].sum = Tree[pre].sum + 1;
	if (Tree[pos].a == Tree[pos].b) return ;
	ll mid = (Tree[pos].a + Tree[pos].b >> 1);
	if (mid >= now) Insert(Tree[pre].lson,Tree[pos].lson);
	else Insert(Tree[pre].rson,Tree[pos].rson);
}

int Query(int pre,int pos,int k){
	if (Tree[pos].lson == Tree[pos].rson) return b[Tree[pos].a];
	ll q = Tree[Tree[pos].lson].sum - Tree[Tree[pre].lson].sum;
	if (q >= k) Query(Tree[pre].lson,Tree[pos].lson,k);
	else Query(Tree[pre].rson,Tree[pos].rson,k - q);
}

int main(){
	cin >> n >> m;
	for (int i = 1;i <= n;i++){
		cin >> a[i];
		b[i] = a[i];
	}
	sort(b + 1,b + 1 + n);
	Build(Root[0],1,n);
	for (int i(1);i <= n;i++){
	    now = lower_bound(b + 1,b + n + 1,a[i]) - b;
	    Insert(Root[i - 1],Root[i]);
	}

	for (int i(1),l,r,k;i <= m;i++){
		cin >> l >> r >> k;
		cout << Query(Root[l - 1],Root[r],k) << endl;
	}
	return 0;
}

全紫,不知道为什么,数组也开够了啊?

2022/1/14 21:02
加载中...