#3 WA求助
查看原帖
#3 WA求助
185310
Cyanogenaq楼主2021/4/28 16:06

except: '2435844051', found: '542737099'

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+10,Mod=1e9+7;
int a[N],n,m,sd,vmax;

//==================================================
struct Cty
{
	int l,r; mutable int x;
	Cty(int a=0,int b=-1,int c=0):l(a),r(b),x(c){}
	inline bool operator< (const Cty&o)const{return o.l>l;}
};

set<Cty> odt;
typedef set<Cty>::iterator iter;

iter split(int x)
{
	if(x>n) return odt.end();
	iter it=--odt.upper_bound(Cty(x,0,0));
	if(it->l==x) return it;
	int l=it->l,r=it->r,v=it->x;
	odt.erase(it);
	odt.insert(Cty(l,x-1,v));
	return odt.insert(Cty(x,r,v)).first;
}

void assign(int l,int r,int v)
{
	iter ir=split(r+1),il=split(l);
	odt.erase(il,ir); odt.insert(Cty(l,r,v));
}

void add(int l,int r,int d)
{
	iter ir=split(r+1),il=split(l);
	for( ; il!=ir; ++il) il->x+=d;
}

int Pow(int a,int b,int p)
{
	int res=1;
	for( ; b; a=1ll*a*a%p,b>>=1)
		if(b&1) res=1ll*res*a%p;
	return res;
}

int sum(int l,int r,int x,int y)
{
	iter ir=split(r+1),il=split(l); int res=0;
	for( ; il!=ir; ++il) (res+=1ll*(il->r-il->l+1)*Pow(il->x,x,y)%y)%=y; return res;
}

int kth(int l,int r,int k)
{
	iter ir=split(r+1),il=split(l);
	vector<pair<int,int> > v;
	for( ; il!=ir; ++il)
		v.push_back(make_pair(il->x,il->r-il->l+1));
	sort(v.begin(),v.end());
	for(int i=0; i<v.size(); i++)
	{
		k-=v[i].second;
		if(k<=0) return v[i].first;
	}
	return -1;
}

//==================================================
int rnd(){int res=sd;sd=(1ll*sd*7+13)%Mod;return res;}

int main()
{
	scanf("%d%d%d%d",&n,&m,&sd,&vmax);
	for(int i=1; i<=n; i++)
		odt.insert(Cty(i,i,rnd()%vmax+1));
	// odt.insert(Cty(n+1,n+1,0));
	while(m--)
	{
		int o=rnd()%4+1;
		int l=rnd()%n+1;
		int r=rnd()%n+1;
		if(l>r) swap(l,r);
		int d=rnd();
		int x=d%(o==3?r-l+1:vmax)+1;
		if(o==1) add(l,r,x);
		else if(o==2) assign(l,r,x);
		else if(o==3) printf("%d\n",kth(l,r,x));
		else
		{
			int y=rnd()%vmax+1;
			printf("%d\n",sum(l,r,x,y));
		}
	}
	return 0;
}

2021/4/28 16:06
加载中...