提交时间:2023-12-04 18:57:32

运行 ID: 23909

//25pts #include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=1e5+10; inline ll read(){ ll x=0;short t=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; }int n,k,q;ll a[maxn][10],dp[2][10][maxn]; ll A[maxn],RES[maxn]; struct RG { int l,r;ll ret; RG(int _l,int _r,ll _ret){ l=_l,r=_r,ret=_ret; }RG(){} }; RG operator+(RG a,RG b){ RG c; c.l=a.l,c.r=b.r,c.ret=a.ret+b.ret; return c; } RG MX(RG a,RG b){ if(a.ret>b.ret)return a; return b; } struct nd { RG mx,lmx,rmx,sm; void init(int l,ll x){ mx=lmx=rmx=sm=RG(l,l,x); }nd(){ mx.ret=-1e18,lmx.ret=rmx.ret=-1e18,sm.ret=0; } }; nd mg(nd a,nd b){ nd c; c.sm=a.sm+b.sm; c.lmx=MX(a.lmx,a.sm+b.lmx); c.rmx=MX(b.rmx,a.rmx+b.sm); c.mx=MX(MX(a.mx,b.mx),a.rmx+b.lmx); return c; } struct SegTree { struct node { nd S[2]; int lz; node(){ lz=0; } }d[maxn<<2]; #define ls(p) (p<<1) #define rs(p) (p<<1|1) #define lz(p) d[p].lz #define S(p,op) d[p].S[op] void pu(int p){S(p,0)=mg(S(ls(p),0),S(rs(p),0)),S(p,1)=mg(S(ls(p),1),S(rs(p),1));} void cl(int p,int x){ if(x)swap(S(p,0),S(p,1)),lz(p)^=x; }void pd(int p){cl(ls(p),lz(p)),cl(rs(p),lz(p)),lz(p)=0;} void bd(int l,int r,int p){ lz(p)=0; if(l==r){ S(p,0).init(l,A[l]),S(p,1).init(l,-A[l]); return; }int mid=l+r>>1; bd(l,mid,ls(p)),bd(mid+1,r,rs(p));pu(p); }void upd(int l,int r,int s,int t,int p){ if(l<=s&&t<=r){cl(p,1);return;}pd(p); int mid=s+t>>1; if(l<=mid)upd(l,r,s,mid,ls(p));if(r>=mid+1)upd(l,r,mid+1,t,rs(p));pu(p); } }T; void slv1(){ up(i,1,k)up(j,0,n)dp[1][i][j]=-1e18;dp[1][1][1]=a[1][1]; up(t,2,n){ int op=t&1; up(i,1,k)dp[op][i][0]=-1e18; up(i,1,k)up(j,1,n){ dp[op][i][j]=max(dp[!op][((i==1)?k:(i-1))][j-1],dp[!op][i][j])+a[t][i]; } }while(q--){ int x=read();ll res=0; up(i,1,k)res=max(res,dp[n&1][i][x]); cout<<res<<'\n'; } } void slv2(){ //up(i,1,n)cout<<a[i][1]<<' '<<a[i][2]<<'\n'; a[n][1]+=(ll)1e18; //up(i,1,n)cout<<a[i][1]<<' '<<a[i][2]<<'\n'; up(i,1,n)A[i]=a[i][2]-a[i][1]; T.bd(1,n,1); ll res=0;up(i,1,n)res+=a[i][1]; for(int i=1;i<=n;i+=2){ RES[i]=res; RES[i]-=(ll)1e18; auto it=T.S(1,0).mx; res+=it.ret; T.upd(it.l,it.r,1,n,1); } a[n][1]-=(ll)1e18; a[n][2]+=(ll)1e18; res=0; up(i,1,n)res+=a[i][1]; up(i,1,n)A[i]=a[i][2]-a[i][1]; T.bd(1,n,1); for(int i=2;i<=n;i+=2){ auto it=T.S(1,0).mx; res+=it.ret; T.upd(it.l,it.r,1,n,1); RES[i]=res; RES[i]-=(ll)1e18; } //up(i,1,n)cout<<"RES "<<RES[i]<<'\n'; while(q--){ int x=read(); cout<<RES[x]<<'\n'; } } void slv(){ n=read(),k=read(),q=read(); up(i,1,k)up(j,1,n)a[j][i]=read(); if(k==2&&n>500)slv2(); else slv1(); }int main(){ // freopen("division.in","r",stdin); // freopen("division.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }