#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
//========================================================
int n,m,c;
long long num[maxn],color[maxn],BIT1[maxn],BIT2[maxn];
inline int lowbit(int x)
{
return x&(-x);
}
long long sum(int x)
{
long long ans=0;
while(x)
{
ans+=BIT1[x];
x-=lowbit(x);
}
return ans;
}
void updata(int x,int now)
{
int delta=now-num[x];
int tmpx=x;
while(tmpx<=n)
{
BIT1[tmpx]+=delta;
tmpx+=lowbit(tmpx);
}
num[x]=now;
tmpx=x;
int lx;
while(tmpx<=n)
{
BIT2[tmpx]=num[tmpx];
lx=lowbit(tmpx);
for(int i=1;i<lx;i<<=1)
BIT2[tmpx]=max(BIT2[tmpx],BIT2[tmpx-i]);
tmpx+=lowbit(tmpx);
}
}
inline long long asksum(int l,int r)
{
return sum(r)-sum(l-1);
}
long long askmax(int l,int r)
{
long long ans=-1;
while(r>=l)
{
ans=max(num[r],ans);
r--;
while(r-lowbit(r)>=l)
{
ans=max(BIT2[r],ans);
r-=lowbit(r);
}
}
return ans;
}
//========================================================
#define IT set<node>::iterator
struct node
{
int l,r,c;
mutable long long v,mx;
node(int L,int R=-1,int C=0,long long V=0,long long MX=-1):l(L),r(R),c(C),v(V),mx(MX){}
bool operator<(const node& o) const
{
return l<o.l;
}
};
set<node> s;
IT split(int pos)
{
IT it=s.lower_bound(node(pos));
if(it!=s.end()&&it->l==pos) return it;
--it;
int L=it->l,R=it->r,C=it->c;
long long v1=asksum(L,pos-1),v2=asksum(pos,R),
mx1=askmax(L,pos-1),mx2=askmax(pos,R);
s.erase(it);
s.insert(node(L,pos-1,C,v1,mx1));
return s.insert(node(pos,R,C,v2,mx2)).first;
}
void assign(int l,int r,int color)
{
long long val=asksum(l,r),mx=askmax(l,r);
IT itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert(node(l,r,color,val,mx));
}
void remake(int pos)
{
IT it=s.lower_bound(node(pos));
int L=it->l,R=it->r;
it->v=asksum(L,R);
it->mx=askmax(L,R);
}
//========================================================
int colorcnt[500];
void opt1(int x,int y)
{
updata(x,y);
remake(x);
}
inline void opt2(int x,int y,int c)
{
assign(x,y,c);
}
long long opt3(int x,int y)
{
memset(colorcnt,0,sizeof(colorcnt));
IT itr=split(y+1),itl=split(x);
IT head=itl,tail=itl;
long long nowc=0,ans=(long long)1e11+7;
while(tail!=itr)
{
int C1=tail->c;
long long V1=tail->v;
colorcnt[C1]++;
nowc+=V1;
int C2=head->c;
long long V2=head->v;
while(colorcnt[C2]-1>0&&head!=tail)
{
nowc-=V2;
colorcnt[C2]--;
head++;
}
bool flag=1;
for(int i=1;i<=c;i++)
if(colorcnt[i]==0)
{
flag=0;
break;
}
if(flag)
{
long long tmpc=nowc;
tmpc=tmpc-V1-V2;
int L1=tail->l,R2=head->r;
tmpc=tmpc+num[L1]+num[R2];
ans=min(tmpc,ans);
}
tail++;
}
return ans;
}
long long opt4(int x,int y)
{
IT itr=split(y+1),itl=split(x);
IT itmp;
long long nowc=0,ans=-1;
while(itl!=itr)
{
itmp=itl;itmp++;
if(itmp==itr) break;
int L1=itl->l,L2=itmp->l,R1=itl->r,R2=itmp->r,C1=itl->c,C2=itmp->c;
long long MX=itl->mx;
ans=max(ans,MX);
if(C1==C2) nowc=0;
else
{
nowc=nowc+num[R1]+num[L2];
ans=max(ans,nowc);
if(R2-L2+1>1) nowc=0;
else nowc-=num[L2];
}
itl++;
}
return ans;
}
//========================================================
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int main()
{
n=read(),m=read(),c=read();
for(int i=1;i<=n;i++)
{
int x=read();
updata(i,x);
num[i]=x;
}
for(int i=1;i<=n;i++)
{
color[i]=read();
s.insert(node{i,i,color[i],num[i],num[i]});
}
while(m--)
{
int opt,x,y,z1;
opt=read();
if(opt==1)
{
x=read(),y=read();
opt1(x,y);
}
else if(opt==2)
{
x=read(),y=read(),z1=read();
opt2(x,y,z1);
}
else if(opt==3)
{
x=read(),y=read();
long long tmp=opt3(x,y);
if(tmp<1e10) printf("%lld\n",tmp);
else printf("-1\n");
}
else
{
x=read(),y=read();
printf("%lld\n",opt4(x,y));
}
}
return 0;
}
运行百行10k代码错误究竟在哪