odt
Inker
·
·
个人记录
#include<cstdio>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long dnt;
struct node{
int l,r;
mutable dnt v;
bool operator < (const node &b)const
{
return l<b.l;
}
};
typedef set<node>::iterator iter;
set<node>se;
int n,m,vmax,seed;
iter split(int pos)
{
iter it=se.lower_bound((node){pos,-1,0});
if(it!=se.end()&&it->l==pos)return it;
--it;
int l=it->l,r=it->r;
dnt v=it->v;
se.erase(it);
se.insert((node){l,pos-1,v});
return se.insert((node){pos,r,v}).first;
}
void assign(int l,int r,dnt v)
{
iter rr=split(r+1),ll=split(l);
se.erase(ll,rr);
se.insert((node){l,r,v});
}
void plu(int l,int r,dnt vv)
{
iter rr=split(r+1),ll=split(l);
for(;ll!=rr;ll++){
ll->v=ll->v + vv;
}
}
struct pr{
dnt v;
int l;
bool operator < (const pr &b){
return v<b.v;
}
};
vector <pr> vc;
dnt quk(int l,int r,int k)
{
iter rr=split(r+1),ll=split(l);
vc.clear();
for(;ll!=rr;ll++){
vc.push_back((pr){ll->v,(ll->r - ll->l + 1)});
}
sort(vc.begin(),vc.end());
for(int i=0;i<vc.size();i++){
k-=vc[i].l;
if(k<=0)return vc[i].v;
}
return 114514;
}
dnt mpow(dnt a,int b,int mod)
{
dnt c=1;
a=a%mod;
for(;b;b>>=1,a=a*a%mod){
if(b&1)c=a*c%mod;
}
return c;
}
dnt qpw(int l,int r,int x,int y)
{
iter rr=split(r+1),ll=split(l);
dnt res=0;
for(;ll!=rr;ll++){
res=(res+mpow(ll->v,x,y)*(ll->r - ll->l +1))%y;
}
return res;
}
int Rand(){
int ret=seed;
seed=(seed*7ll+13)%1000000007;
return ret;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&seed,&vmax);
for(int i=1;i<=n;i++){
int xx=Rand()%vmax+1;
se.insert((node){i,i,xx});
}
int op,l,r,x,y;
for(int i=1;i<=m;i++){
op=Rand()%4+1;
l=Rand()%n+1;
r=Rand()%n+1;
if(l>r)swap(l,r);
if(op==3)x=(Rand()%(r-l+1))+1;
else x=Rand()%vmax+1;
if(op==4) y=Rand()%vmax+1;
if(op==1) plu(l,r,x);
if(op==2) assign(l,r,x);
if(op==3) {
printf("%lld\n",quk(l,r,x));
}
if(op==4){
printf("%lld\n",qpw(l,r,x,y));
}
}
return 0;
}