MnZn刚学 ODT,WA 求助
查看原帖
MnZn刚学 ODT,WA 求助
434929
Usada_Pekora楼主2022/5/14 11:54

Wrong Answer.

wrong answer 158th numbers differ - expected: '25529012', found: '38104142'

#include <bits/stdc++.h>
#define int long long
const int Mod = 1e9 + 7;
using namespace std;
struct node {
	int l, r;
	mutable int val;
	node(int _l = 0, int _r = -1, int _val = 0) : l(_l), r(_r), val(_val) {}
	bool operator < (const node &x) const {
		return l < x.l;
	}
};
int n, m, seed, vmax;
set<node> s;
typedef set<node>::iterator iter;
inline iter split(int pos) {
	iter it = s.lower_bound(node(pos));
	if(it != s.end() && it->l == pos) return it;
	it--;
	node tmp = *it;
	s.erase(it), s.insert(node(tmp.l, pos - 1, tmp.val));
	return s.insert(node(pos, tmp.r, tmp.val)).first;
}
inline void assign(int l, int r, int val) {
	iter itr = split(r + 1), itl = split(l);
	s.erase(itl, itr);
	s.insert(node(l, r, val));
}
inline void add(int l, int r, int val) {
	iter itr = split(r + 1), itl = split(l);
	for(iter it = itl; it != itr; it++) 
		it->val += val;
}
inline int kth(int l, int r, int k) {
	vector<pair<int, int> > a;
	a.clear();
	iter itr = split(r + 1), itl = split(l);
	for(iter it = itl; it != itr; it++) a.push_back(make_pair(it->val, it->r - it->l + 1));
	sort(a.begin(), a.end());
	for(int i = 0; i < a.size(); i++) {
		k -= a[i].second;
		if(k <= 0) return a[i].first;
	}
	return -1;
}
inline int qpow(int x, int y, int mod) {
	int res = 1;
	while(y) {
		if(y & 1) res = res * x % mod;
		x = x * x % mod, y >>= 1;
	}
	return res;
}
inline int getpow(int l, int r, int x, int y) {
	int res = 0;
	iter itr = split(r + 1), itl = split(l);
	for(iter it = itl; it != itr; it++) {
		res = (res + (it-> r - it->l + 1) * qpow(it->val % y, x, y) % y) % y;
	}
	return res;
}
inline int rnd() {
	int res = seed;
	seed = (seed * 7 + 13) % Mod;
	return res;
}
signed main() {
	cin >> n >> m >> seed >> vmax;
	for(int i = 1; i <= n; i++) s.insert(node(i, i, rnd() % vmax + 1));
	for(int i = 1; i <= m; i++) {
		int op = rnd() % 4 + 1, l = rnd() % n + 1, r = rnd() % n + 1, x, y;
		if(l > r) swap(l, r);
		if(op == 3) x = rnd() % (r - l + 1) + 1;
		else x = rnd() % vmax + 1;
		if(op == 1) add(l, r, x);
		else if(op == 2) assign(l, r, x);
		else if(op == 3) printf("%lld\n", kth(l, r, x));
		else y = rnd() % vmax + 1, printf("%lld\n", getpow(l, r, x, y));
	}
	return 0;
}
2022/5/14 11:54
加载中...