提交时间:2023-12-02 19:47:30

运行 ID: 23883

#include<bits/stdc++.h> using namespace std; #define int long long #define endl "\n" #define lc(x) ((x)<<1) #define rc(x) ((x)<<1|1) int n,k,q; int a[21][50030]; int sw[3010][3010]; int mn[21]; int A,B,C; inline int F(int x){ return A^(B*x+C); } inline void BF(){ for(int l=1;l<=n;l++){ for(int i=1;i<=k;i++) mn[i]=a[i][l]; for(int r=l;r<=n;r++){ int mx=0; for(int i=1;i<=k;i++) mn[i]=min(a[i][r],mn[i]),mx=max(mx,mn[i]); sw[l][r]=sw[l][r-1]+F(mx); } } while(q--){ int L,R; cin>>L>>R; int res=0; for(int i=L;i<=R;i++) res+=sw[i][R]; cout<<res<<endl; } } struct node{ int a,b; friend node operator +(const node A,const node B){ return {A.a+B.a,A.b+B.b}; } friend node operator *(const node A,const int x){ return {A.a*x,A.b*x}; } friend node operator *(const int x,const node A){ return {A.a*x,A.b*x}; } inline int f(int x){return a*x+b;} }w[50030<<2],tg[50030<<2]; inline void pd(int x,int l,int r){ int mid=l+r>>1; w[lc(x)]=w[lc(x)]+tg[x]*(mid-l+1); w[rc(x)]=w[rc(x)]+tg[x]*(r-mid); tg[lc(x)]=tg[lc(x)]+tg[x]; tg[rc(x)]=tg[rc(x)]+tg[x]; tg[x]={0,0}; } inline void upd(int x){ w[x]=w[lc(x)]+w[rc(x)]; } inline void mod(int x,int l,int r,int L,int R,node A){ //if(x==1){ // cout<<L<<" "<<R<<" "<<A.a<<" "<<A.b<<endl;; //} //cout<<x<<" "<<l<<" "<<r<<" "<<L<<" "<<R<<endl; //cout.flush(); if(L>R)return ; if(L<=l&&r<=R){ tg[x]=tg[x]+A; w[x]=w[x]+A*(r-l+1); return ; } pd(x,l,r); int mid=l+r>>1; if(L<=mid)mod(lc(x),l,mid,L,R,A); if(R>mid)mod(rc(x),mid+1,r,L,R,A); upd(x); } inline node g(int x,int l,int r,int L,int R){ if(L>R)return {0,0}; if(L<=l&&r<=R)return w[x]; pd(x,l,r); int mid=l+r>>1; node res={0,0}; if(L<=mid)res=res+g(lc(x),l,mid,L,R); if(R>mid)res=res+g(rc(x),mid+1,r,L,R); return res; } struct ASK{ int l,id; }; vector<ASK>T[50030]; int stk[50030]; int ANS[50030]; int sz[50030]; inline void K1(){ for(int i=1;i<=q;i++){ int l,r; cin>>l>>r; T[r].push_back({l,i}); } a[1][0]=-1; int tp=0; for(int i=1;i<=n;i++){ while(a[1][stk[tp]]>=a[1][i]) mod(1,1,n,stk[tp-1]+1,stk[tp],(node){-F(a[1][stk[tp]]),F(a[1][stk[tp]])*(i-1)}),tp--; mod(1,1,n,stk[tp]+1,i,{F(a[1][i]),-F(a[1][i])*(i-1)}); stk[++tp]=i; for(auto A:T[i])ANS[A.id]=g(1,1,n,A.l,i).f(i); } for(int i=1;i<=q;i++) cout<<ANS[i]<<endl; } signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); //freopen("s4.in","r",stdin); //freopen("plant.in","r",stdin); //freopen("plant.out","w",stdout); cin>>k>>n>>q; for(int i=1;i<=k;i++) for(int j=1;j<=n;j++) cin>>a[i][j]; cin>>A>>B>>C; if(n<=2000&&q<=2000)BF(); else if(k==1)K1(); cout.flush(); return 0; }