題意
最近實驗室正在爲其管理的超級計算機編制一套任務管理系統,而你被安排完成其中的查詢部分。超級計算機中的任務用三元組(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任務從第Si秒開始,在第Ei秒後結束(第Si秒和Ei秒任務也在運行),其優先級爲Pi。同一時間可能有多個任務同時執行,它們的優先級可能相同,也可能不同。調度系統會經常向查詢系統詢問,第Xi秒正在運行的任務中,優先級最小的Ki個任務(即將任務按照優先級從小到大排序後取前Ki個)的優先級之和是多少。特別的,如果Ki大於第Xi秒正在運行的任務總數,則直接回答第Xi秒正在運行的任務優先級之和。上述所有參數均爲整數,時間的範圍在1到n之間(包含1和n)。
解
主席數差分一下,再每個節點記一個和就好了
代碼
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<queue>
#define For(i,j,k) for(int i=(j);i<=(int)k;i++)
#define Forr(i,j,k) for(int i=(j);i>=(int)k;i--)
#define Rep(i,u) for(int i=Begin[u],v=to[i];i;i=Next[i],v=to[i])
#define Set(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define ll long long
#define getchar getchar_unlocked
#define L(i) (T[i].s[0])
#define R(i) (T[i].s[1])
#define S(i) (T[i].sum)
#define s(i) (T[i].ss)
using namespace std;
const int N=100001,INF=0x3f3f3f3f;
int m,n;
template <class T>inline void read(T &x){
x=0;char c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
}
int P[N];
vector<int>ins[N],del[N];
struct A{
ll x;
int id;
bool operator <(const A &r)const{
return x<r.x;
}
};
struct node{
int s[2],sum;
ll ss;
};
struct cht{
node T[N*40];
int rk[N],rt[N],cnt,n,tot,nn;
A a[N];
#define mid ((l+r)>>1)
inline void init(int num,int S){
cnt=0;nn=num,tot=1;
For(i,1,nn)a[i].id=i,a[i].x=P[i];
sort(a+1,a+nn+1);
For(i,1,nn)rk[a[i].id]=i;
For(i,1,S){
rt[i]=rt[i-1];
For(j,0,ins[i].size()-1)
insert(rk[ins[i][j]],rt[i],1,nn,1);
For(j,0,del[i].size()-1)
insert(rk[del[i][j]],rt[i],1,nn,-1);
}
}
void insert(int val,int &x,int l,int r,ll add){
T[++cnt]=T[x],x=cnt,S(x)+=add,s(x)+=add*a[val].x;
if(l==r)return ;
if(val<=mid)insert(val,L(x),l,mid,add);
else insert(val,R(x),mid+1,r,add);
}
ll query(int x,ll k){
k=min((ll)S(rt[x]),k);
return query(rt[x],1,nn,k);
}
ll query(int u,int l,int r,int k){
int sum=S(L(u));
if(l==r)return s(u);
if(k<=sum)return query(L(u),l,mid,k);
else return query(R(u),mid+1,r,k-sum)+s(L(u));
}
}t;
int main(){
ll pre=1;
read(m),read(n);
For(i,1,m){
ll s,e,p;
read(s),read(e),read(p);
P[i]=p;
ins[s].pb(i);
del[e+1].pb(i);
}
t.init(m,n);
For(i,1,n){
ll x,a,b,c,k;
read(x),read(a),read(b),read(c);
k=(a*pre+b)%c+1;
printf("%lld\n",pre=t.query(x,k));
}
return 0;
}