#include "hieroglyphs.h"
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_pbds;
#define all(v) v.begin(), v.end()
vector<int> comb(vector<int> a,vector<int> b)
{
	for (int i:b) a.push_back(i);
	return a;
}
vector<int> solve(int* A,int* B,int l,int r,int l1,int r1)
{
	int n=r-l,m=r1-l1;
	if (n<=0 or m<=0) return {};
	auto a=A+l;
	auto b=B+l1;
	cc_hash_table<int,pair<int,int>> ind,ind1;
	for (int i=0;i<n;i++)
	{
		if (ind.find(a[i])==ind.end()) ind[a[i]]={i,i};
		ind[a[i]].second=i;
	}
	for (int i=0;i<m;i++)
	{
		if (ind1.find(b[i])==ind1.end()) ind1[b[i]]={i,i};
		ind1[b[i]].second=i;
	}
	if (min(n,m)==n)
	{
		if (n==1)
		{
			if (ind1.find(a[0])!=ind1.end()) return {a[0]};
			else return {};
		}
		int mid=n/2;
		for (int i=0;i<=mid;i++)
		{
			if (ind1.find(a[mid-i])!=ind1.end())
			{
				int x=a[mid-i];
				return comb(solve(A,B,l,ind[x].second,l1,ind1[x].second),
				comb({x},solve(A,B,ind[x].first+1,r,ind1[x].first+1,r1)));
			}
			if (mid+i<n && ind1.find(a[mid+i])!=ind1.end())
			{
				int x=a[mid+i];
				return comb(solve(A,B,l,ind[x].second,l1,ind1[x].second),
				comb({x},solve(A,B,ind[x].first+1,r,ind1[x].first+1,r1)));
			}
		}
		return {};
	}
	if (m==1)
	{
		if (ind.find(b[0])!=ind.end()) return {b[0]};
		else return {};
	}
	int mid=m/2;
	for (int i=0;i<=mid;i++)
	{
		if (ind.find(b[mid-i])!=ind.end())
		{
			int x=b[mid-i];
			return comb(solve(A,B,l,ind[x].second,l1,ind1[x].second),
			comb({x},solve(A,B,ind[x].first+1,r,ind1[x].first+1,r1)));
		}
		if (mid+i<m && ind.find(b[mid+i])!=ind.end())
		{
			int x=b[mid+i];
			return comb(solve(A,B,l,ind[x].second,l1,ind1[x].second),
			comb({x},solve(A,B,ind[x].first+1,r,ind1[x].first+1,r1)));
		}
	}
	return {};
}
vector<int> ucs(vector<int> a, vector<int> b)
{
	int n=a.size(),m=b.size();
	int a1[n],b1[m];
	for (int i=0;i<n;i++) a1[i]=a[i];
	for (int i=0;i<m;i++) b1[i]=b[i];
	vector<int> v=solve(a1,b1,0,n,0,m);
	unordered_map<int,vector<int>> ind,ind1;
	for (int i=0;i<n;i++) ind[a[i]].push_back(i);
	for (int i=0;i<m;i++) ind1[b[i]].push_back(i);
	int pre=-1;
	for (int i=0;i<(int)v.size();i++)
	{
		if (!ind.count(v[i])) return {-1};
		auto x=upper_bound(all(ind[v[i]]),pre);
		if (x!=ind[v[i]].end())
			pre=*x;
		else
			return {-1};
	}
	pre=-1;
	for (int i=0;i<(int)v.size();i++)
	{
		if (!ind1.count(v[i])) return {-1};
		auto x=upper_bound(all(ind1[v[i]]),pre);
		if (x!=ind1[v[i]].end())
			pre=*x;
		else
			return {-1};
	}
	return v;
}
| # | 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... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |