RE求调
查看原帖
RE求调
999274
CNS_5t0_0r2楼主2024/8/7 19:53
#include<bits/stdc++.h>
#define mid ((l + r) >> 1)
#define lchild t[root].Lchild
#define rchild t[root].Rchild
#define new_lchild t[new_root].Lchild
#define new_rchild t[new_root].Rchild
using namespace std;
const int N = 20009,INF = 2e9;
int n,Q;
pair<int,int> a[N];
int ans;
struct node{
	int sum,lsum,rsum;
	int Lchild,Rchild;
} t[N << 5];
int Root[N],node_cnt;

bool in_range(int l,int r,int L,int R){
	return L <= l && r <= R;
}
bool out_range(int l,int r,int L,int R){
	return l > R || r < L;
}

void push_up(int root){
	t[root].sum = t[lchild].sum + t[rchild].sum; 
	t[root].lsum = max(t[lchild].lsum,t[lchild].sum + t[rchild].lsum);
	t[root].rsum = max(t[rchild].rsum,t[rchild].sum + t[lchild].rsum);
}
void build(int &new_root,int l,int r){
	if(!new_root)
		new_root = ++node_cnt;
	if(l == r){
	    t[new_root].sum = t[new_root].lsum = t[new_root].rsum = 1;
		return;
	}
	build(new_lchild,l,mid);
	build(new_rchild,mid + 1,r);
	push_up(new_root);
}
void update(int root,int &new_root,int l,int r,int k){
	if(!new_root)
		new_root = ++node_cnt;
	if(l == r){
		t[new_root].sum = -1;
		t[new_root].lsum = t[new_root].rsum = 0;
		return;
	}
	if(k <= mid){
		new_rchild = rchild;
		new_lchild = ++node_cnt;
		t[new_lchild] = t[lchild];
		update(lchild,new_lchild,l,mid,k);
	}
	else{
		new_lchild = lchild;
		new_rchild = ++node_cnt;
		t[new_rchild] = t[rchild];
		update(rchild,new_rchild,mid + 1,r,k);
	}
	push_up(new_root);
}
node query(int root,int l,int r,int L,int R){
	if(root <= 0){
		cout << "Error\n";
		exit(0);
	}
	if(out_range(l,r,L,R))
		return (node){-INF,-INF,-INF};
	if(in_range(l,r,L,R))
		return t[root];
	node ql = query(lchild,l,mid,L,R),qr = query(rchild,mid + 1,r,L,R);
	return (node){
		ql.sum + qr.sum,
		max(ql.lsum,ql.sum + qr.lsum),
		max(qr.rsum,qr.sum + ql.rsum)
	};
}
int q[5];
int main(){
	//freopen("T1.in","r",stdin);
	//freopen("my.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin >> n;
	for(int i = 1;i <= n;i++){
		cin >> a[i].first;
		a[i].second = i;
	}
	sort(a + 1,a + n + 1);
	
	for(int i = 1;i <= n;i++)
		Root[i] = ++node_cnt;
	build(Root[1],1,n);
	for(int i = 2;i <= n;i++)
		update(Root[i - 1],Root[i],1,n,a[i - 1].second);
	cin >> Q;
	while(Q--){
		cin >> q[1] >> q[2] >> q[3] >> q[4];
		q[1] = (q[1] + ans) % n + 1;
		q[2] = (q[2] + ans) % n + 1;
		q[3] = (q[3] + ans) % n + 1;
		q[4] = (q[4] + ans) % n + 1;
		sort(q + 1,q + 5);
		int l = 1,r = n;
		while(l <= r){
			node u = query(Root[mid],1,n,q[1],q[2] - 1);
			node v = query(Root[mid],1,n,q[2],q[3]);
			node w = query(Root[mid],1,n,q[3] + 1,q[4]);
			if(u.rsum + v.sum + w.lsum >= 0){
				ans = mid;
				l = mid + 1;
			}
			else
				r = mid - 1;
		}
		ans = a[ans].first;
		cout << ans << '\n';
	}
	return 0;
}
2024/8/7 19:53
加载中...