RT,珂朵莉树板子打挂了,照着第一篇题解学的,样例都没过,QAQ
#include<bits/stdc++.h>
#define int long long
using namespace std;
int seed;
struct node{
int l,r;
mutable int v;
node(int L,int R=-1,int V=0):l(L),r(R),v(V){}
bool operator<(const node& x) const{
return l<x.l;
}
};
set<node>s;
int rnd(){
int qwq=seed;
seed=(seed*7+13)%1000000007;
return qwq;
}
set<node>::iterator split(int x){
set<node>::iterator i=s.lower_bound(node(x));
if(i!=s.end()&&i->l==x)return i;
i--;
int ll=i->l,rr=i->r,vv=i->v;
s.erase(i);
s.insert(node(ll,x-1,vv));
return s.insert(node(x,rr,vv)).first;
}
void add(int l,int r,int val){
set<node>::iterator ir=split(r+1),il=split(l);
for(;il!=ir;il++)il->v+=val;
}
void assign(int l,int r,int v){
set<node>::iterator ir=split(r+1),il=split(l);
s.erase(il,ir);
s.insert(node(l,r,v));
}
int rank(int l,int r,int k){
vector<pair<int,int> >ve;
set<node>::iterator ir=split(r+1),il=split(l);
ve.clear();
for(;il!=ir;il++)
ve.push_back(pair<int,int>(il->v,il->r-il->l+1));
sort(ve.begin(),ve.end());
for(vector<pair<int,int> >::iterator i=ve.begin();i!=ve.end();i++){
k-=i->second;
if(k<=0)return i->first;
}
return -1;
}
int ksm(int a,int b,int md){
int x=1;
a%=md;
while(b){
if(b&1)x=x*x%md;
a=a*a%md;
b>>=1;
}
return x;
}
int sumpow(int l,int r,int n,int md){
set<node>::iterator ir=split(r+1),il=split(l);
int x=0;
for(;il!=ir;il++)
x=(x+(il->r-il->l+1)*ksm(il->v,n,md)%md)%md;
return x;
}
signed main(){
int n,m,vm;
scanf("%lld%lld%lld%lld",&n,&m,&seed,&vm);
for(int i=1;i<=n;i++)
s.insert(node(i,i,(rnd()%vm)+1));
s.insert(node(n+1,n+1,0));
for(int i=1;i<=m;i++){
int op=rnd()%4+1,l=rnd()%n+1,r=rnd()%n+1;
if(l>r)swap(l,r);
int x,y;
if(op==3)x=rnd()%(r-l+1)+1;
else x=rnd()%vm+1;
if(op==4)y=rnd()%vm+1;
if(op==1)add(l,r,x);
else if(op==2)assign(l,r,x);
else if(op==3)printf("%lld\n",rank(l,r,x));
else printf("%lld\n",sumpow(l,r,x,y));
}
return 0;
}