调不动了,WA,挂在 #8,有时候挂在 #10
悬赏 1~2 关注
#pragma GCC optimize(3,"inline","Ofast")
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse3","sse2","sse")
#pragma GCC target("avx","sse4","sse4.1","sse4.2","ssse3")
#pragma GCC target("f16c")
#pragma GCC optimize("inline","fast-math","unroll-loops","no-stack-protector")
#pragma GCC diagnostic error "-fwhole-program"
#pragma GCC diagnostic error "-fcse-skip-blocks"
#pragma GCC diagnostic error "-funsafe-loop-optimizations"
#pragma GCC diagnostic error "-std=c++14"
#include<bits/stdc++.h>
#define rint register int
using namespace std;
const long long MOD=1000000000000000003;
long long multi(long long a,long long b){
a%=MOD,b%=MOD;
return ((a*b-(long long)((long double)a/MOD*b+1e-8)*MOD)%MOD+MOD)%MOD;
}
long long read(){
char ch;
ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
long long x=0;
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x;
}
void write(long long x){
if(x>9)write(x/10);
putchar((x%10)+'0');
}
const int N=300005;
long long num[N<<2],mul[N<<2],ad[N<<2],cost[N],val[N];
int pos[N];
set<int> zxj;
long long inv(long long x){
long long y=MOD-2,ans=1;
for(;y;x=multi(x,x),y>>=1)if(y&1)ans=multi(ans,x);
return ans;
}
void pushup(int x){
num[x]=(num[x<<1]+num[x<<1|1])%MOD;
}
void pushdown(int x,int l,int r){
int mid=(l+r)>>1;
long long adt=ad[x],mut=mul[x];
int llen=mid-l+1,rlen=r-mid;
num[x<<1]=(multi(num[x<<1],mut)+adt*llen)%MOD;
num[x<<1|1]=(multi(num[x<<1|1],mut)+adt*rlen)%MOD;
mul[x<<1]=multi(mul[x<<1],mut);
mul[x<<1|1]=multi(mul[x<<1|1],mut);
ad[x<<1]=(multi(ad[x<<1],mut)+adt)%MOD;
ad[x<<1|1]=(multi(ad[x<<1|1],mut)+adt)%MOD;
ad[x]=0;
mul[x]=1;
}
void build(int x,int l,int r){
mul[x]=1;
if(l==r){
num[x]=cost[l];
return;
}
int mid=(l+r)>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x);
}
void add(int x,int l,int r,int L,int R,long long k){
if(L<=l&&r<=R){
num[x]=(num[x]+k*(r-l+1))%MOD;
ad[x]=ad[x]+k;
return;
}
pushdown(x,l,r);
int mid=(l+r)>>1;
if(L<=mid)add(x<<1,l,mid,L,R,k);
if(R>mid)add(x<<1|1,mid+1,r,L,R,k);
pushup(x);
}
void mult(int x,int l,int r,int L,int R,long long k){
if(L<=l&&r<=R){
num[x]=multi(num[x],k);
ad[x]=multi(ad[x],k);
mul[x]=multi(mul[x],k);
return;
}
pushdown(x,l,r);
int mid=(l+r)>>1;
if(L<=mid)mult(x<<1,l,mid,L,R,k);
if(R>mid)mult(x<<1|1,mid+1,r,L,R,k);
pushup(x);
}
long long query(int x,int l,int r,int L,int R){
if(L<=l&&r<=R)return num[x]%MOD;
pushdown(x,l,r);
int mid=(l+r)>>1;
long long sum=0;
if(L<=mid)sum+=query(x<<1,l,mid,L,R);
if(R>mid)sum+=query(x<<1|1,mid+1,r,L,R);
return sum%MOD;
}
int n,m,q;
signed main(){
cin>>n>>m>>q;
for(rint i=1;i<=m;++i)scanf("%d",pos+i),zxj.insert(pos[i]);
for(rint i=1;i<=m;++i)val[pos[i]]=read();
for(rint i=1;i<=n;++i){
if(val[i])cost[i]=0;
else{
long long lval=val[*(--zxj.lower_bound(i))];
int rdis=*zxj.lower_bound(i)-i;
cost[i]=rdis*lval;
}
}
build(1,1,n);
for(rint i=1;i<=q;++i){
int op,x,y;
scanf("%d%d%d",&op,&x,&y);
int lpos=*(--zxj.lower_bound(x)),rpos=*zxj.lower_bound(x);
long long lval=val[lpos],rval=val[rpos];
if(op==1){
add(1,1,n,lpos+1,x-1,MOD-lval*(rpos-x));
mult(1,1,n,x,x,0);
mult(1,1,n,x+1,rpos-1,multi(inv(lval),y));
zxj.insert(x);
val[x]=y;
}
else write(query(1,1,n,x,y)),printf("\n");
}
return 0;
}