求调
查看原帖
求调
965238
Fwio_楼主2023/11/19 09:49
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
#include<vector>
#define IT set<node> :: iterator
using namespace std;
const int N = 100010;
int n , m , seed , vmax;
int a[N];
struct node{
	int l , r;
	mutable int v;
	node(int L , int R = -1 , int V = 0) : l(L) , r(R) , v(V) {}
	bool operator < (const node &_) const {
		return l < _.l;
	}
};set<node> s;
int rnd(){
	int ret = seed;
    seed = (seed * 7 + 13) % 1000000007;
    return ret;
}
int qp(int a , int n , int p){
	int ans = 1;
	while(n){
		if(n & 1) ans = (ans * a) % p;
		n >>= 1;
		a = (a * a) % p;
	}
	return ans;
}
IT split(int pos){
	IT it = s.lower_bound(node(pos));
	if(it != s.end() && it -> l == pos) return it; --it;
	if(it -> r < pos) return s.end();
	int L = it -> l , R = it -> r , V = it -> v;
	s.erase(it);
	s.insert(node(L , pos - 1 , V));
	return s.insert(node(pos , R , V)).first;
}
void add(int l , int r , int x){
	IT R = split(r + 1) , L = split(l);
	for(IT it = L;it != R;it++) it -> v += x;
}
void assign(int l , int r , int x){
	IT R = split(r + 1) , L = split(l);
	s.erase(L , R);
	s.insert(node(l , r , x));
}
int Rank(int l , int r , int x){
	vector<pair<int , int> > t;
	IT R = split(r + 1) , L = split(l);
	for(IT it = L;it != R;it++) t.push_back({it -> v , it -> r - it -> l + 1});
	sort(t.begin() , t.end());
	for(int i = 0;i < t.size();i++){
		x -= t[i].second;
		if(x <= 0) return t[i].first;
	}
}
int sum(int l , int r , int x , int y){
	int ans = 0;
	IT R = split(r + 1) , L = split(l);
	for(IT it = L;it != R;it++) ans = (ans + (qp(it -> v , x , y)) * (it -> r - it -> l + 1) % y) % y;
	return ans; 
}
int main(){
	cin >> n >> m >> seed >> vmax;
	for(int i = 1;i <= n;i++) a[i] = (rnd() % vmax) + 1;
	while(m--){
		int opt = (rnd() % 4) + 1;
		int l = (rnd() % n) + 1;
		int r = (rnd() % n) + 1;
		int x , y;
		if(l > r) swap(l , r);
		if(opt == 3) x = (rnd() % (r - l + 1)) + 1;
		else x = (rnd() % vmax) + 1;
		if(opt == 4) y = (rnd() % vmax) + 1;
		if(opt == 1) add(l , r , x);
		else if(opt == 2) assign(l , r , x);
		else if(opt == 3) cout << Rank(l , r , x) << endl;
		else cout << sum(l , r , x , y) << endl;
	}
	return 0;
}

不知道哪里写炸了

2023/11/19 09:49
加载中...