操作3出了问题,调了一天/kk
#include<stdio.h>
#include<iostream>
#include<cstring>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=100005;
const int inf=0x3f3f3f3f;
int n,m,a[maxn],mx,co[maxn];
int ct[205];
inline int read(void)
{
int num,sign=1;char c;
while(!isdigit(c=getchar()))if(c=='-')sign=0;num=c-'0';
while(isdigit(c=getchar()))num=(num<<1)+(num<<3)+c-'0';
return sign?num:-num;
}
struct anstree
{
int tr[maxn];
int mxx[maxn<<2];
inline void modifysum(int x,int d){for(;x<=n;x+=x&-x)tr[x]+=d;}
inline int querysum(int x){int res=0;for(;x;x-=x&-x)res+=tr[x];return res;}
void modifymx(int k,int l,int r,int x,int val)
{
if(l==r)return mxx[k]=val,void();
int mid=(l+r)>>1;
if(mid>=x)modifymx(k<<1,l,mid,x,val);
else modifymx(k<<1|1,mid+1,r,x,val);
mxx[k]=max(mxx[k<<1],mxx[k<<1|1]);
}
int querymx(int k,int l,int r,int x,int y)
{
if(l>=x&&r<=y)return mxx[k];
int mid=(l+r)>>1;
if(mid>=x&&mid>=y)return querymx(k<<1,l,mid,x,y);
else if(mid<y&&mid<x)return querymx(k<<1|1,mid+1,r,x,y);
return max(querymx(k<<1,l,mid,x,y),querymx(k<<1|1,mid+1,r,x,y));
}
}ccz;
struct node
{
int l,r;
int val;
node(int L,int R=-1,int V=0):l(L),r(R),val(V){}
friend bool operator<(node a,node b){return a.l<b.l;}
};
struct colortree
{
set<node>s;
typedef set<node>::iterator IT;
inline IT split(int x)
{
IT it=s.lower_bound(node(x));
if(it!=s.end()&&it->l==x)return it;
--it;
int l=it->l,r=it->r;
int val=it->val;
s.erase(it);
s.insert(node(l,x-1,val));
return s.insert(node(x,r,val)).first;
}
inline void assign(int l,int r,int val)
{
IT itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert(node(l,r,val));
}
inline void querycolor(int l,int r)
{
if(r-l+1<mx){printf("-1\n");return;}
IT itr=split(r+1),itl=split(l);
IT ll=itl,rr=itl;
--rr;
memset(ct,0,sizeof ct);ct[0]=inf;
int now=0,ans=inf;
while(rr!=itr)
{
while(rr!=itr&&now<mx)
{
++rr;
if(rr==s.end())break;
if(!ct[rr->val])++now;
++ct[rr->val];
}
if(now<mx)break;
ans=min(ans,ccz.querysum(rr->l)-ccz.querysum(ll->r-1));
now-=!(--ct[ll->val]),++ll;
}
if(ans==inf)printf("-1\n");
else printf("%d\n",ans);
}
inline void querynum(int l,int r)
{
IT itr=split(r+1),itl=split(l);
memset(ct,0,sizeof ct);
IT ll=itl;
++ct[itl->val];
int sum=a[itl->r],ans=-1;
while(itl!=itr)
{
ans=max(ans,ccz.querymx(1,1,n,itl->l,itl->r));
while(ct[itl->val]>=2)--ct[ll->val],sum-=a[ll->r],++ll;
ans=max(ans,sum);
if(itl->l!=itl->r){while(ll!=itl)--ct[ll->val],++ll;sum=a[itl->r];}
++itl,sum+=a[itl->l],++ct[itl->val];
}
printf("%d\n",ans);
}
}chthollyccz;
signed main(void)
{
n=read(),m=read(),mx=read();
for(register int i=1;i<=n;++i)ccz.modifysum(i,a[i]=read()),ccz.modifymx(1,1,n,i,a[i]);
for(register int i=1;i<=n;++i)co[i]=read();
for(register int j=1,i=1;i<=n;i=j+1,j=i)
{
while(co[j]==co[j+1])++j;
chthollyccz.s.insert(node(i,j,co[j]));
}
chthollyccz.s.insert(node(0,0,-1));
for(register int l,r,opt,i=1;i<=m;++i)
{
opt=read(),l=read(),r=read();
if(opt==1)
ccz.modifysum(l,r-a[l]),ccz.modifymx(1,1,n,l,r),a[l]=r;
else if(opt==2)
chthollyccz.assign(l,r,read());
else if(opt==3)
chthollyccz.querycolor(l,r);
else
chthollyccz.querynum(l,r);
}
}
一直是 80pts