Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* obtain array b from array a by sorting a range any number of times in a */
- /* the trick will be to use sort opportunity as to sort two adjacent element so that a number comes to pos a from pos b without changing relative order of other elements */
- void update(int node,int st,int en,int pos,int v)
- {
- if(st>pos or en<pos)return ;
- if(st==en)
- {
- tree[node]=v;
- return ;
- }
- int mid=(st+en)>>1;
- update(node*2,st,mid,pos,v);
- update(node*2+1,mid+1,en,pos,v);
- tree[node]=min(tree[node*2],tree[node*2+1]);
- }
- int query(int node,int st,int en,int l,int r)
- {
- if(st>r or en<l)return INT_MAX;
- if(st>=l and en<=r)return tree[node];
- int mid=(st+en)>>1;
- int v=query(node*2,st,mid,l,r);
- int w=query(node*2+1,mid+1,en,l,r);
- return min(v,w);
- }
- vector<int>s[mx];
- int main()
- {
- int i,j,k,l,m,n;
- scanf("%d",&m);
- while(m--)
- {
- scanf("%d",&n);
- for(int i=1;i<=n;i++)s[i].clear();
- for(int i=1;i<=n;i++)
- {
- scanf("%d",&ara[i]);
- update(1,1,n,i,ara[i]);
- s[ara[i]].pb(i);
- }
- for(int i=1;i<=n;i++)sort(s[i].rbegin(),s[i].rend());
- for(int i=1;i<=n;i++)
- {
- scanf("%d",&bara[i]);
- }
- int ck=1;
- for(int i=1;i<=n;i++)
- {
- int l=bara[i];
- if(s[l].size()==0)
- {
- ck=0;
- break;
- }
- int p=s[l][s[l].size()-1];
- s[l].pop_back();
- int k=query(1,1,n,1,p-1);
- if(k<l)ck=0;
- update(1,1,n,p,INT_MAX);
- }
- if(ck)printf("YES\n");
- else printf("NO\n");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement