#include<bits/stdc++.h>
#include<algorithm>
#include<random>
#include<chrono>
#include<cstdlib>
#include<ctime>
#include<numeric>
#include<vector>
#include<stack>
#include<map>
#include<set>
#include<queue>
#include<iomanip>
#define int long long
#define ll long long
#define L LLONG_MAX
#define fi first
#define se second
#define pii pair<int,int>
#define sz(a) ((int)a.size())
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define REP(i,k,j) for(int i=k;i>=j;i--)
#define FORD(i,a) for(auto i:a)
#define rngdcl mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count())
#define random(l,r) ((l)+(rng()%(r-l+1)))
using namespace std;
const int nmax=5e4+1;
int n,m,q;
vector<int> a;
vector<int> b;
map<pair<pii,int>,int> mp;
void input()
{
cin >> n >> m >> q;
a.push_back(0);
b.push_back(0);
FOR(i,1,n)
{
int x; cin >> x;
a.push_back(x);
}
FOR(i,1,m)
{
int x; cin >> x;
b.push_back(x);
}
}
struct SEGTREE
{
vector<int> tree;
int n=0;
void build(int id,int l,int r,vector<int> &a)
{
if(l==r)
{
tree[id]=a[l];
return;
}
int mid=(l+r)/2;
build(id*2,l,mid,a);
build(id*2+1,mid+1,r,a);
tree[id]=max(tree[id*2],tree[id*2+1]);
}
SEGTREE() = default;
void init(int N,vector<int> &a)
{
n=N;
tree.resize(4*n+5,0);
build(1,1,n,a);
}
int getl(int id,int l,int r,int x,int val) //get in range [1,x]
{
if(x<l) return -1;
if(tree[id]<=val) return -1;
if(l==r) return l;
int mid=(l+r)/2;
int save=getl(id*2+1,mid+1,r,x,val);
if(save>-1) return save;
else return getl(id*2,l,mid,x,val);
}
int getr(int id,int l,int r,int x,int val) //get in range [x,n]
{
if(r<x) return 1e16;
if(tree[id]<=val) return 1e16;
if(l==r) return l;
int mid=(l+r)/2;
int save=getr(id*2,l,mid,x,val);
if(save<1e16) return save;
else return getr(id*2+1,mid+1,r,x,val);
}
};
SEGTREE st1,st2;
int dfs(int x,int y,int d)
{
if(x<=0 || y<=0 || x>n || y>m) return -1;
if(mp.count({{x,y},d})) return mp[{{x,y},d}];
if(d==1)
{
int l=0,r=m+1;
if(y!=1) l=max(l,st2.getl(1,1,m,y-1,a[x]));
if (y!=m) r=min(r,st2.getr(1,1,m,y+1,a[x]));
return mp[{{x,y},d}]=max(y-l+dfs(x,l,2),r-y+dfs(x,r,2));
}
else
{
int l=0,r=n+1;
if(x!=1) l=max(l,st1.getl(1,1,n,x-1,b[y]));
if(x!=n) r=min(r,st1.getr(1,1,n,x+1,b[y]));
return mp[{{x,y},d}]=max(x-l+dfs(l,y,1),r-x+dfs(r,y,1));
}
}
void solve()
{
st1.init(n,a);
st2.init(m,b);
while(q--)
{
int x,y; cin >> x >> y;
cout << max(dfs(x,y,1),dfs(x,y,2)) << '\n';
}
}
signed main()
{
//freopen(".inp", "r", stdin);
//freopen(".out", "w", stdout);
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
input();
solve();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |