80分求助
查看原帖
80分求助
124314
lcyxds楼主2021/3/12 12:00
#pragma GCC optimize(2)
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

int m, n;
struct Task{
	int p;
	int v;
};
vector<Task> _taskList[10000010];

//zhuxishu
struct Node{
//	int l;
//	int r;
	int left;
	int right;
	int count;
	long long sum;
} _xds[30000010];
int _cc;
int _banben[100010];

inline int NewNode() {
	return ++_cc;
}

inline int Copy(int x) {
	_xds[++_cc] = _xds[x];
	return _cc;
}

void Push(int& x, int l, int r, int p, int v) {
//	if (!x) x = NewNode();
//	cout << "Push(" << x << ',' << l << ',' << r << ',' << p << ',' << v << endl;
//	if (p < l || p > r) while (true);
	_xds[x].count+=v;
	_xds[x].sum+=p*v;
	if (l!=r) {
		int mid = l+r>>1;
		if (p<=mid) {
			_xds[x].left = Copy(_xds[x].left);
			Push(_xds[x].left, l, mid, p, v);
			return;
		}
		_xds[x].right = Copy(_xds[x].right);
		Push(_xds[x].right, mid+1, r, p, v);
	}
}
//

long long Query(int x, int l, int r, long long k) {
//	cout << x << ',' << l << ',' << r << ',' << k << endl;
	if (l==r || k >= _xds[x].count) return _xds[x].sum;
	int mid = l+r>>1;
	int countl = _xds[_xds[x].left].count;
	if (k<=countl) return Query(_xds[x].left, l, mid, k);
	return _xds[_xds[x].left].sum+Query(_xds[x].right, mid+1, r, k-countl);
}

inline long long Solve(int x, int k) {
	return Query(_banben[x], 1, 10000000, k);
}

int main() {
	int s, e, p;
	int x, a, b, c;
	Task solo;
	long long k;
	long long pre = 1ll;
	freopen("P3168.in", "r", stdin);
	freopen("P3168.out", "w", stdout);
	scanf("%d%d", &m, &n);
	for (int i = 0; i < m; i++) {
		scanf("%d%d%d", &s, &e, &p);
		solo.p = p;
		solo.v = 1;
		_taskList[s].push_back(solo);
		if (e < n) {
			solo.v = -1;
			_taskList[e+1].push_back(solo);
		}
	}
	for (int i = 1; i <= n; i++) {
		_banben[i] = Copy(_banben[i-1]);
		for (int j = 0; j < _taskList[i].size(); j++) {
//			cout << i << ',' << _taskList[i][j].p << ',' << _taskList[i][j].v << endl;
			Push(_banben[i], 1, 10000000, _taskList[i][j].p, _taskList[i][j].v);
		}
	}
//	cout << _xds[0].count << ',' << _xds[0].left << ',' << _xds[0].right << ',' << _xds[0].sum << endl;
//	cout << _cc << endl;
	for (int i = 0; i < n; i++) {
		scanf("%d%d%d%d", &x, &a, &b, &c);
		k = 1+(a*pre+b)%c;
		pre = Solve(x, k);
		printf("%lld\n", pre);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}
2021/3/12 12:00
加载中...