20pts主席树求调
查看原帖
20pts主席树求调
289296
zymooll楼主2023/9/24 22:01

rt

// Author:zymooll

#include<bits/stdc++.h>
#define getchar getchar_unlocked
#define putchar putchar_unlocked
#define int long long
using namespace std;
int read(){
  int s = 0, w = 1;
  char c = getchar();
  while(c < '0' || c > '9'){
    if(c == '-')w = -1;
    c = getchar();
  }
  while(c >= '0' && c <= '9'){
    s = s * 10 + c - '0';
    c = getchar();
  }
  return s * w;
}
void print(int x){
  if(x < 0){
    putchar('-');
    x = -x;
  }
  if(x >= 10)print(x / 10);
  putchar(x % 10 + '0');
  return;
}
const int NMax = 1e5;
const int MMax = 1e7;
int n, m;
int rt[MMax + 10];
vector<pair<int, int> >q;
struct SegmentTree{
  struct Node{
    int sum, tot, l, r;
  }t[256 * NMax + 10];
  int ncnt;
  int clone(int p){
    t[++ncnt] = t[p];
    return ncnt;
  }
  void modify(int tl, int& tr, int L, int R, int x, int opt){//1:add -1:del
    tr = clone(tl);
    t[tr].tot += opt, t[tr].sum += x * opt;
    // cerr << tl << " " << tr << " " << L << " " << R << " " << x << " " << opt << endl;
    if(L == R)return;
    int mid = (L + R) / 2;
    if(x <= mid)modify(t[tl].l, t[tr].l, L, mid, x, opt);
    else modify(t[tl].r, t[tr].r, mid + 1, R, x, opt);
  }
  int ask(int p, int L, int R, int k){
    // cerr << p << " " << L << " " << R << " " << k << endl;
    if(L == R)return t[p].sum - (t[p].tot - k) * L;
    int mid = (L + R) / 2;
    if(k <= t[t[p].l].tot)return ask(t[p].l, L, mid, k);
    else return t[t[p].l].sum + ask(t[p].r, mid + 1, R, k - t[t[p].l].tot);
  }
}T;
signed main(){
  //freopen(".in","r",stdin);
  //freopen(".out","w",stdout);
  n = read(), m = read(); q.reserve(2 * n + 10);
  for(int i = 1; i <= n; i++){
    int l = read(), r = read(), k = read();
    q.push_back(make_pair(l, k));
    q.push_back(make_pair(r + 1, -k));
  }
  sort(q.begin(), q.end());
  int now = 0, last = 0;
  for(int i = 1; i <= n; i++){
    // cerr << i << endl;
    while(q[now].first == i){
      rt[q[now].first] = 0;
      if(q[now].second > 0)T.modify(last, rt[q[now].first], 1, MMax, q[now].second, 1);
      else T.modify(last, rt[q[now].first], 1, MMax, -q[now].second, -1);
      last = rt[q[now].first]; now++;
      // cerr << now << " " << last << endl;
    }
    if(!rt[i])rt[i] = rt[i - 1];
  }
  int pre = 1;
  while(m--){
    int x = read(), a = read(), b = read(), c = read();
    int k = 1 + (a * pre + b) % c;
    print(pre = T.ask(rt[x], 1, MMax, k)), putchar('\n');
  }
  return 0;
}
2023/9/24 22:01
加载中...