标签:namespace 问题 交换 清华 情况 暑假 归并 分治 problem
#include<bits/stdc++.h>
#define R register int
using namespace std;
const int N=100001;
const int M=600000;
const int T=400001;
const int Mx=100000;
int S,n,m,op,l,r,a,b,ans,q,K,tot,w[N];
struct ip{int r,a,b;}nw;
vector<ip>G[T];
int gi(){
R x=0,k=1;char c=getchar();
while(c!=‘-‘&&(c<‘0‘||c>‘9‘))c=getchar();
if(c==‘-‘)k=-1,c=getchar();
while(c<=‘9‘&&c>=‘0‘)x=(x<<3)+(x<<1)+c-‘0‘,c=getchar();
return x*k;
}
void upd(R i){
R ls=(i<<1),rs=(ls|1),llen=G[ls].size(),rlen=G[rs].size();
G[i].clear();
for(R p=0,q=0;p<llen&&q<rlen;){
R a=1ll*G[ls][p].a*G[rs][q].a%m,b=(1ll*G[rs][q].a*G[ls][p].b+G[rs][q].b)%m;
if(G[ls][p].r==G[rs][q].r)G[i].push_back((ip){G[ls][p].r,a,b}),++p,++q;
else if(G[ls][p].r<G[rs][q].r)G[i].push_back((ip){G[ls][p].r,a,b}),++p;
else G[i].push_back((ip){G[rs][q].r,a,b}),++q;
}
}
int mdf(R Le,R Ri,R i){// tot l r a b
if(Le==Ri){
if(l!=1)G[i].push_back((ip){l-1,1,0});
G[i].push_back((ip){r,a,b});
if(r!=n)G[i].push_back((ip){n,1,0});
return 1;
}
R mid=(Le+Ri)>>1,ls=(i<<1),rs=(ls|1);
if(tot<=mid){mdf(Le,mid,ls);return 0;}
else {
R op=mdf(mid+1,Ri,rs);
if(op)upd(i);return op;
}
}
void query(R Le,R Ri,R l,R r,R i){//K
if(Le==l&&Ri==r){
R le=0,ri=G[i].size()-1,res=-1;
while(le<=ri){
R Mid=(le+ri)>>1;
if(K>G[i][Mid].r)le=Mid+1;
else res=Mid,ri=Mid-1;
}
ans=(1ll*ans*G[i][res].a%m+G[i][res].b)%m;
return ;
}
R mid=(Le+Ri)>>1,ls=(i<<1),rs=(ls|1);
if(r<=mid)query(Le,mid,l,r,ls);
else if(l>mid)query(mid+1,Ri,l,r,rs);
else query(Le,mid,l,mid,ls),query(mid+1,Ri,mid+1,r,rs);
}
int main(){
S=gi(),n=gi(),m=gi();
for(R i=1;i<=n;++i)w[i]=gi();
q=gi();
for(R t=1;t<=q;++t){
op=gi();
if(op==1){
l=gi(),r=gi(),a=gi()%m,b=gi()%m,++tot;
if(S&1)l^=ans,r^=ans;
mdf(1,Mx,1);//l r a b;
}
else {
l=gi(),r=gi(),K=gi();if(S&1)l^=ans,r^=ans,K^=ans;
ans=w[K],query(1,Mx,l,r,1);
printf("%d\n",ans);
}
}
return 0;
}
标签:namespace 问题 交换 清华 情况 暑假 归并 分治 problem
原文地址:https://www.cnblogs.com/Tyher/p/10090299.html