封装 ODT #3WA 求助
查看原帖
封装 ODT #3WA 求助
93701
Morgen_Kornblume楼主2021/5/18 18:24
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<set>
#include<stdio.h>
#include<cmath>
#include<cstdlib>
#include<cassert>
#define ll long long
using namespace std;

const ll mod=1000000007;

ll n,m,seed,vmax;

ll rnd(){
	ll ret=seed;
	seed=(seed*7+13)%mod;
	return ret;
}

template<class _T>
class Chtholly_Tree{
	
	private:
		struct zone{
			
			int l,r;
			mutable _T val;
			
			zone(int a=-1,int b=-1,_T c=0){
				l=a;r=b;val=c;
			}
			bool operator < (zone a)const{
				return l<a.l;
			}
		};
		
		set<zone>st;
		
		typename set<zone>::iterator split(int pos){
			typename set<zone>::iterator it=st.lower_bound(zone(pos));	
			if(it!=st.end()&&it->l==pos)return it;
			--it; zone tmp=*it; st.erase(it);
			st.insert(zone(tmp.l,pos-1,tmp.val));
			return st.insert(zone(pos,tmp.r,tmp.val)).first;
		}
		
		ll ksm(ll a,ll b,ll p){
			a%=p;
			ll res=1;
			while(b){
				if(b&1)res=(res*a)%p;
				a=(a*a)%p;
				b=b>>1;
			}
			return res;
		}
		
	public:
		void init(){
			st.clear();
			for(int i=1;i<=n;i++){
				ll in=(rnd() % vmax) + 1ll;
				st.insert((zone){i,i,in});
			}
		}
		
		void assign(int l,int r,_T val){
			typename set<zone>::iterator itr=split(r+1),itl=split(l);
			st.erase(itl,itr);
			st.insert((zone){l,r,val});
		}
		
		_T query_sum(int l,int r){
			typename set<zone>::iterator itr=split(r+1),itl=split(l);
			_T res=0;
			for(typename set<zone>::iterator it = itl;it!=itr;++it){
				res+=(it->r - it->l + 1)*it->val;	
			}
			return res;
		}
		
		void add(int l,int r,_T val){
			typename set<zone>::iterator itr=split(r+1),itl=split(l);
			for(typename set<zone>::iterator it=itl;it!=itr;++it){
				it->val+=val;
			}
		}
		
		_T query_Kth(int l,int r,int k){
			vector<pair<ll,int> >vec;
			vec.clear();
			typename set<zone>::iterator itr=split(r+1),itl=split(l);
			for(typename set<zone>::iterator it=itl;it!=itr;++it){
				vec.push_back(make_pair(it->val,((it->r) - (it->l) +1ll)));
			}
			sort(vec.begin(),vec.end());
			for(typename vector<pair<ll,int> >::iterator it=vec.begin();it!=vec.end();++it){
				if(k-=it->second <=0)return it->first;	
			}
			assert(false);
			return -1;
		}
		
		_T query_M(int l,int r,ll b,ll p){
			ll res=0;
			typename set<zone>::iterator itr=split(r+1),itl=split(l);
			for(typename set<zone>::iterator it=itl;it!=itr;++it){
				res=( (res+(ksm(it->val,b,p)*((ll)(it->r)-(it->l)+1ll)%p))%p )%p;
			}
			return res;
		}
};



Chtholly_Tree<ll>cht;

int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m>>seed>>vmax;
	
	cht.init();
	/*
	for(int i=1;i<=n;i++){
		ll in=(rnd() % vmax) + 1ll;
		//cout<<in<<" ";
		cht.assign(i,i,in);
	}*/
	//cout<<"\n";
	
	for(int i=1;i<=m;i++){
		int op = (rnd() % 4) + 1;
    	int l = (rnd() % n) + 1;
    	int r = (rnd() % n) + 1;

    	if (l > r) swap(l, r);
		
		ll x,y;
		if (op == 3)
        	x = (rnd() % (ll)(r - l + 1ll)) + 1ll;
    	else
        	x = (rnd() % vmax) + 1ll;

    	if (op == 4)
        	y = (rnd() % vmax) + 1ll;
		
		if(op==1){
			cht.add(l,r,x);
		}
		if(op==2){
			cht.assign(l,r,x);
		}
		if(op==3){
			cout<<cht.query_Kth(l,r,x)<<endl;
		}
		if(op==4){
			cout<<cht.query_M(l,r,x,y)<<endl;
			//cout<<l<<" "<<r<<" "<<x<<" "<<y<<endl;
		}
		//else{
		/////	cout<<l<<" "<<r<<" "<<x<<endl;
		//}
	}
	return 0;
}
2021/5/18 18:24
加载中...