#include<bits/stdc++.h>
using namespace std;
using Int = long long;
template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}

template <typename T,typename E>
struct SegmentTree{
  using F = function<T(T,T)>;
  using G = function<T(T,E)>;
  using H = function<E(E,E)>;
  int n,height;
  F f;
  G g;
  H h;
  T ti;
  E ei;
  vector<T> dat;
  vector<E> laz;
  SegmentTree(int n_,F f,G g,H h,T ti,E ei):
    f(f),g(g),h(h),ti(ti),ei(ei){init(n_);}
  void init(int n_){
    n=1;height=0;
    while(n<n_) n<<=1,height++;
    dat.assign(2*n,ti);
    laz.assign(2*n,ei);
  }
  void build(int n_, vector<T> v){
    for(int i=0;i<n_;i++) dat[n+i]=v[i];
    for(int i=n-1;i;i--)
      dat[i]=f(dat[(i<<1)|0],dat[(i<<1)|1]);
  }
  inline T reflect(int k){
    return g(dat[k],laz[k]);
  }
  inline void eval(int k){
    if(laz[k]==ei) return;
    laz[(k<<1)|0]=h(laz[(k<<1)|0],laz[k]);
    laz[(k<<1)|1]=h(laz[(k<<1)|1],laz[k]);
    dat[k]=reflect(k);
    laz[k]=ei;
  }
  inline void thrust(int k){
    for(int i=height;i;i--) eval(k>>i);
  }
  inline void recalc(int k){    
    while(k>>=1)
      dat[k]=f(reflect((k<<1)|0),reflect((k<<1)|1));
  }
  void update(int a,int b,E x){
    thrust(a+=n);
    thrust(b+=n-1);
    for(int l=a,r=b+1;l<r;l>>=1,r>>=1){
      if(l&1) laz[l]=h(laz[l],x),l++;
      if(r&1) --r,laz[r]=h(laz[r],x);
    }
    recalc(a);
    recalc(b);
  }
  void set_val(int a,T x){
    thrust(a+=n);
    dat[a]=x;laz[a]=ei;
    recalc(a);
  }
  T query(int a,int b){
    thrust(a+=n);
    thrust(b+=n-1);
    T vl=ti,vr=ti;
    for(int l=a,r=b+1;l<r;l>>=1,r>>=1) {
      if(l&1) vl=f(vl,reflect(l++));
      if(r&1) vr=f(reflect(--r),vr);
    }
    return f(vl,vr);
  }
};

//INSERT ABOVE HERE
signed main(){
  using T = tuple<Int, Int, Int, Int>;
  
  auto f=[](T a,T b){
           Int aw,ax,ay,az;
           tie(aw,ax,ay,az)=a;
           Int bw,bx,by,bz;
           tie(bw,bx,by,bz)=b;
           Int cw=min(aw,bw);
           Int cx=(aw==bw?ax+bx:(aw<bw?ax:bx));
           Int cy=max(ay,by);
           Int cz=(ay==by?az+bz:(ay>by?az:bz));
           return T(cw,cx,cy,cz);
         };
  auto g=[](T a,Int b){
           Int aw,ax,ay,az;
           tie(aw,ax,ay,az)=a;
           return T(aw+b,ax,ay+b,az);
         };
  auto h=[](Int a,Int b){return a+b;};

  Int H,W,Q;
  scanf("%lld %lld %lld",&H,&W,&Q);
  vector<T> A,B;
  for(Int i=0;i<H;i++){
    Int v;
    scanf("%lld",&v);
    A.emplace_back(v,1,v,1);
  }
  for(Int i=0;i<W;i++){
    Int v;
    scanf("%lld",&v);
    B.emplace_back(v,1,v,1);
  }
  
  const Int INF = 1e17;
  T ti(INF,0,-INF,0);
  SegmentTree<T, Int> segY(H,f,g,h,ti,0);
  SegmentTree<T, Int> segX(W,f,g,h,ti,0);
  segY.build(H,A);
  segX.build(W,B);

  auto calc=[](Int t,T a,T b,Int p,Int q){
              Int aw,ax,ay,az;
              tie(aw,ax,ay,az)=a;
              Int bw,bx,by,bz;
              tie(bw,bx,by,bz)=b;
              Int res=t==3?
                min({aw*bw,aw*by,ay*bw,ay*by}):
                max({aw*bw,aw*by,ay*bw,ay*by});
              Int cnt=0;
              Int n=p-(!aw?ax:!ay?az:0ll);
              Int m=q-(!bw?bx:!by?bz:0ll);
              if(res==0) cnt=p*q-n*m;
              else{
                if(aw==ay) az=0;
                if(bw==by) bz=0;
                if(res==aw*bw) cnt+=ax*bx;
                if(res==aw*by) cnt+=ax*bz;
                if(res==ay*bw) cnt+=az*bx;
                if(res==ay*by) cnt+=az*bz;
              }
              printf("%lld %lld\n",res,cnt);
            };
  
  for(Int i=0;i<Q;i++){
    Int t;
    scanf("%lld",&t);
    if(t==1){
      Int a,b,v;
      scanf("%lld %lld %lld",&a,&b,&v);
      segY.update(--a,b,v);
    }
    if(t==2){
      Int c,d,v;
      scanf("%lld %lld %lld",&c,&d,&v);
      segX.update(--c,d,v);
    }
    if(t==3||t==4){
      Int a,b,c,d;
      scanf("%lld %lld %lld %lld",&a,&b,&c,&d);
      T y=segY.query(--a,b);
      T x=segX.query(--c,d);
      calc(t,y,x,b-a,d-c);
    }
  }
  return 0;
}



Measured memory_bytes: 31888