#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<iomanip>
#include<math.h>
#include<complex>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<functional>
#include<assert.h>
#include<numeric>
using namespace std;
#define REP(i,m,n) for(int i=(int)(m) ; i < (int) (n) ; ++i )
#define rep(i,n) REP(i,0,n)
typedef long long ll;
typedef pair<int,int> pint;
typedef pair<ll,int> pli;
const int inf=1e9+7;
const ll longinf=1LL<<60 ;
const ll mod=1e9+7 ;

template<typename T>
struct LazySegmentTree{
private:
    int n;
    vector<T> node;
    vector<int> lazy;
    T E0;
    int E1=0;

    inline void updatef(int& lazy,int& value){
        //lazy += value;
        lazy += value;
        //lazy = max(lazy, value);
        //lazy = min(lazy, value);
    }
    inline void calculatef(T& node,int& lazy,int len){
        //node += lazy * len;
        // node += lazy ;
        node.first += lazy ;
    }
    inline T queryf(T& x,T& y){
        //return x + y;
        //return x * y;
        //return max(x, y);
        if(x.first<y.first)return x;
        else if(x.first>y.first)return y;
        else return {x.first, x.second+y.second};
    }
public:
    LazySegmentTree(int sz,T nodeE,int lazyE = 0):E0(nodeE), E1(lazyE){
        n=1;
        while(n<sz)n<<=1;
        node.resize(2*n-1,E0);
        lazy.resize(2*n-1,E1);
    }

    LazySegmentTree(vector<T>& v,T E0,int E1=0 ):E0(E0),E1(E1){
        n=1;
        int sz=v.size();
        while(n<sz)n<<=1;
        node.resize(2*n-1,E0);
        lazy.resize(2*n-1,E1);
        rep(i,sz)node[i+n-1] = v[i];
        for(int i=n-2; i>=0; --i){
            node[i] = queryf(node[2*i+1],node[2*i+2]);
        }
    }

    void eval(int k,int l,int r){
        if(lazy[k]==E1)return ;
        calculatef(node[k], lazy[k], r-l);
        if(r-l>1){
            updatef(lazy[2*k+1], lazy[k]);
            updatef(lazy[2*k+2], lazy[k]);
        }
        lazy[k]=E1;
    }

    void update(int a, int b, int x,int k=0,int l=0,int r=-1){
        if(r<0)r=n;
        eval(k,l,r);
        if(r<=a||b<=l)return;
        if(a<=l&&r<=b){
            updatef(lazy[k], x);
            eval(k,l,r);
        }
        else {
            update(a,b,x,2*k+1,l,(l+r)/2);
            update(a,b,x,2*k+2,(l+r)/2,r);
            node[k]=queryf(node[2*k+1], node[2*k+2]);
        }
    }

    T query(int a,int b,int k=0,int l=0,int r=-1){
        if(r<0)r=n;
        eval(k,l,r);
        if(r<=a||b<=l)return E0;
        if(a<=l&&r<=b)return node[k];
        T xl=query(a,b,2*k+1,l,(l+r)/2);
        T xr=query(a,b,2*k+2,(l+r)/2,r);
        return queryf(xl, xr);
    }
};

pair<ll,ll> fun(pair<ll,ll> p,pair<ll,ll>q){
    if(p.first<q.first)return p;
    if(p.first>q.first)return q;
    else return {p.first,p.second+q.second};
}
pair<ll,ll> mul(pair<ll,ll> p,pair<ll,ll>q){
    return {p.first*q.first, p.second*q.second};
}


int main(){
    int h,w,q;
    cin>>h>>w>>q;
    vector<pair<ll,ll>> h1(h),h2(h),w1(w),w2(w);
    rep(i,h){
        cin>>h1[i].first;
        h2[i].first=-h1[i].first;
        h1[i].second=h2[i].second=1;
    } 
    rep(i,w){
        cin>>w1[i].first;
        w2[i].first=-w1[i].first;
        w1[i].second=w2[i].second=1;
    } 
    pair<ll,ll> e={longinf,1};
    LazySegmentTree<pair<ll,ll>> hmin(h1,e),hmax(h2,e),wmin(w1,e),wmax(w2,e);
    while(q--){
        int type;
        cin>>type;
        if(type==1){
            int a,b,c;
            cin>>a>>b>>c;
            hmin.update(a-1,b,c);
            hmax.update(a-1,b,-c);
        }
        else if(type==2){
            int a,b,c;
            cin>>a>>b>>c;
            wmin.update(a-1,b,c);
            wmax.update(a-1,b,-c);
        }
        else if(type==3){
            int a,b,c,d;
            cin>>a>>b>>c>>d;
            auto Hmin=hmin.query(a-1, b);
            auto Hmax=hmax.query(a-1, b);
            auto Wmin=wmin.query(c-1, d);
            auto Wmax=wmax.query(c-1, d);
            Hmax.first*=-1;
            Wmax.first*=-1;
            if(Hmin.second==b-a+1)Hmax={Hmin.first,0};
            if(Wmin.second==d-c+1)Wmax={Wmin.first,0};
            pair<ll,ll> ans={longinf,1};
            ans=fun(ans,mul(Hmin,Wmin));
            ans=fun(ans,mul(Hmax,Wmin));
            ans=fun(ans,mul(Hmin,Wmax));
            ans=fun(ans,mul(Hmax,Wmax));
            if(ans.first==0){
                ll cnth=0,cntw=0;
                if(Hmax.first==0)cnth=Hmax.second;
                if(Hmin.first==0)cnth=Hmin.second;
                if(Wmax.first==0)cntw=Wmax.second;
                if(Wmin.first==0)cntw=Wmin.second;
                ans.second=(ll)(d-c+1)*(b-a+1)-(b-a+1-cnth)*(d-c+1-cntw);
            }
            cout<<ans.first<<" "<<ans.second<<endl;
        }
        else if(type==4){
            int a,b,c,d;
            cin>>a>>b>>c>>d;
            auto Hmin=hmin.query(a-1, b);
            auto Hmax=hmax.query(a-1, b);
            auto Wmin=wmin.query(c-1, d);
            auto Wmax=wmax.query(c-1, d);
            Hmax.first*=-1;
            Wmin.first*=-1;
            if(Hmin.second==b-a+1)Hmax={Hmax.first,0};
            if(Wmin.second==d-c+1)Wmax={Wmax.first,0};
            pair<ll,ll> ans={longinf,1};
            ans=fun(ans,mul(Hmin,Wmin));
            ans=fun(ans,mul(Hmax,Wmin));
            ans=fun(ans,mul(Hmin,Wmax));
            ans=fun(ans,mul(Hmax,Wmax));
            if(ans.first==0){
                ll cnth=0,cntw=0;
                if(Hmax.first==0)cnth=Hmax.second;
                if(Hmin.first==0)cnth=Hmin.second;
                if(Wmax.first==0)cntw=Wmax.second;
                if(Wmin.first==0)cntw=Wmin.second;
                ans.second=(ll)(d-c+1)*(b-a+1)-(b-a+1-cnth)*(d-c+1-cntw);
            }
            cout<<-ans.first<<" "<<ans.second<<endl;
        }
    } 
    return 0;
}


Measured memory_bytes: 28888