萌新求助主席树
查看原帖
萌新求助主席树
242543
Ryo_Yamada楼主2020/10/4 19:18

rt,WA 40

#include <bits/stdc++.h>
#define ll long long

namespace IO {
    const int SIZE = (1 << 20) + 1;
    char ibuf[SIZE], *iS, *iT, obuf[SIZE],*oS = obuf, *oT = obuf + SIZE - 1;
    char _st[55];
    int _qr = 0;
    inline char gc() {
        return (iS == iT ? iT = (iS = ibuf) + fread(ibuf, 1, SIZE, stdin), (iS == iT ? EOF : *iS++) : *iS++);
    }
    inline void qread() {}
    template<class T1, class ...T2>
    inline void qread(T1 &IEE, T2&... ls) {
        register T1 __ = 0, ___ = 1;
        register char ch;
        while(!isdigit(ch = gc())) ___ = (ch == '-') ? -___ : ___;
        do {
            __ = (__ << 1) + (__ << 3) + (ch ^ 48);
        }while(isdigit(ch = gc()));
        __ *= ___;
        IEE = __;
        qread(ls...);
        return ;
    }
    inline void flush() {
        fwrite(obuf, 1, oS - obuf, stdout);
        oS = obuf;
        return ;
    }
    inline void putc_(char _x) {
        *oS++ = _x;
        if(oS == oT) flush();
    }
    inline void qwrite() {}
    template<class T1, class ...T2>
    inline void qwrite(T1 IEE, T2... ls) {
        if(!IEE) putc_('0');
        if(IEE < 0) putc_('-'), IEE = -IEE;
        while(IEE) _st[++_qr] = IEE % 10 + '0', IEE /= 10;
        while(_qr) putc_(_st[_qr--]);
        qwrite(ls...);
        return ;
    }
    struct Flusher_{~Flusher_(){flush();}}io_flusher;
}

using namespace IO;
using namespace std;

const int N = 1e5 + 5;
const int inf = 0x3f3f3f3f;

struct SegTree {
	int cnt, lson, rson;
	ll sum;
	#define t(x) Tree[x]
	#define l(x) Tree[x].lson
	#define r(x) Tree[x].rson
	#define c(x) Tree[x].cnt
	#define s(x) Tree[x].sum
} Tree[N << 5];

int n, m, tot;
int a[N], b[N], rt[N << 5];
vector<int> v1[N], v2[N];

void update(int &root, int l, int r, int lst, int x, int v) {
	root = ++tot;
	t(root) = t(lst);
	c(root) += v, s(root) += 1ll * b[x] * v;
	if(l == r) return ;
	int mid = (l + r) >> 1;
	if(mid >= x) update(l(root), l, mid, l(lst), x, v);
	else update(r(root), mid + 1, r, r(lst), x, v); 
}

ll query(int root, int l, int r, int v) {
	int num = c(l(root));
	if(l == r) return s(root) / (1ll * c(root)) * v;
	int mid = (l + r) >> 1;
	if(num >= v) return query(l(root), l, mid, v);
	else return query(r(root), mid + 1, r, v - num) + s(l(root));
}

int main() {
	qread(m, n);
	for(int i = 1; i <= m; i++) {
		int x, y;
		qread(x, y);
		v1[x].push_back(i);
		v2[y + 1].push_back(i);
		qread(a[i]);
		b[i] = a[i];
	}
	sort(b + 1, b + m + 1);
	int kk = unique(b + 1, b + m + 1) - b - 1; 
	for(int i = 1; i <= n; i++) {
		rt[i] = rt[i - 1];
		for(auto j : v1[i]) {
			int up = lower_bound(b + 1, b + kk + 1, a[j]) - b;
			update(rt[i], 1, kk, rt[i], up, 1);
		}
		for(auto j : v2[i]) {
			int up = lower_bound(b + 1, b + kk + 1, a[j]) - b;
			update(rt[i], 1, kk, rt[i], up, -1);
		}
	} 
	ll ans = 1;
	while(n--) {
		int x, p, q, k;
		qread(x, p, q, k);
		int pre = (1ll * p * ans + q) % k + 1;
		if(pre > c(rt[x])) ans = s(rt[x]);
		else ans = query(rt[x], 1, kk, pre);
		printf("%lld\n", ans);
	}
	return 0;
}
2020/10/4 19:18
加载中...