RT,对照tj看了一下也没什么,为什么会莫名奇妙TLE?
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define doit cout<<"OK"
typedef pair<ll,int> pii;
const int mod=1e9+7,maxn=1e5+10;
struct node{
int l,r;
mutable ll val;
node(int le,int ri=0,ll v=0){
l=le,r=ri,val=v;
}
bool operator<(const node &a)const{
return l<a.l;
}
};
set<node>odt;
int n,m,x,y,a[maxn],opt,l,r,vmax,seed;
ll rnd(){
ll ret=seed;
seed=(seed*7+13)%mod;
return ret;
}
ll power(int a,int b,int p){
ll ans=1;
a%=p;
while(b){
if(b&1)
ans=ans*a%p;
a=a*a%p;
b>>=1;
}
return ans;
}
auto split(int pos){
auto it=odt.lower_bound(node(pos));
if(it!=odt.end()&&it->l==pos)
return it;
it--;
if(it->r<x)
return odt.end();
int l=it->l,r=it->r;
ll val=it->val;
odt.erase(it);
odt.insert(node(l,pos-1,val));
return odt.insert(node(pos,r,val)).first;
}
void assign(int l,int r,ll val){
auto itr=split(r+1),itl=split(l);
odt.erase(itl,itr);
odt.insert(node(l,r,val));
}
void update(int l,int r,ll val){
auto itr=split(r+1),itl=split(l);
for(auto it=itl;it!=itr;it++)
it->val+=val;
}
ll kth(int l,int r,int k){
vector<pii>vec;
auto itr=split(r+1),itl=split(l);
for(auto it=itl;it!=itr;it++)
vec.push_back(pii(it->val,it->r-it->l+1));
sort(vec.begin(),vec.end());
for(auto it=vec.begin();it!=vec.end();it++){
k-=it->second;
if(k<=0)
return it->first;
}
return -1;
}
ll sum(int l,int r,int x,int y){
ll ans=0;
auto itr=split(r+1),itl=split(l);
for(auto it=itl;it!=itr;it++)
ans=(ans+power(it->val,x,y)*(it->r-it->l+1))%y;
return ans;
}
int main(){
scanf("%d%d%d%d",&n,&m,&vmax,&seed);
for(int i=1;i<=n;i++){
a[i]=rnd()%vmax+1;
odt.insert(node(i,i,a[i]));
}
while(m--){
opt=rnd()%4+1,l=rnd()%n+1,r=rnd()%n+1;
if(l>r)
swap(l,r);
if(opt==3)
x=rnd()%(r-l+1)+1;
else
x=rnd()%vmax+1;
if(opt==4)
y=rnd()%vmax+1;
if(opt==1)
update(l,r,x);
if(opt==2)
assign(l,r,x);
if(opt==3)
printf("%lld\n",kth(l,r,x));
if(opt==4)
printf("%lld\n",sum(l,r,x,y));
}
return 0;
}