t恤

有 n 件T恤。第 i 件T恤的价格为 pi 。每个T恤有两面,第 i 件T恤正面颜色为 ai ,反面颜色为 bi 。

有 m 个人想买T恤,每个人都恰好买一件。第 j 个人最喜欢颜色 cj

一个人会选择买一件至少有一面颜色为他喜欢的颜色的,最便宜的T恤。如果没有合法的T恤,则不买。这些人按照给定的顺序来购买。

你的任务是求出每个人会花多少钱。

Input

第一行包含一个整数 n (1 ≤ n ≤ 200 000) — 表示T恤的数量。

之后一行为 p1, p2, ..., pn (1 ≤ pi ≤ 1 000 000 000), pi 表示第 i 件T恤的价格。

之后一行为 a1, a2, ..., an (1 ≤ ai ≤ 3), ai 表示第 i 件T恤正面的颜色。

之后一行为 b1, b2, ..., bn (1 ≤ bi ≤ 3), bi 表示第 i 件T恤背面的颜色。

之后一行包含一个整数 m (1 ≤ m ≤ 200 000) — 表示消费者人数。

之后一行为 c1, c2, ..., cm (1 ≤ cj ≤ 3), where cj表示第 j 个消费者最喜欢的颜色。这些消费者会按输入的顺序一个一个来购买。

 

Output

一行 m 个数 — 第 j 个数表示第 j-th buyer will buy. If the j 个消费者需要花的钱数。如果不购买,输出 -1。

Example

Input

5
300 200 400 500 911
1 2 1 2 3
2 1 3 2 1
6
2 3 1 2 1 1

Output

200 400 300 500 911 -1 

Input

2
1000000000 1
1 1
1 2
2
2 1

Output

1 1000000000 
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;
const int maxn = 200010;
set<int> st[4];
int pri[maxn];
int main() {
    int n, temp, m;
    while(cin >> n)
    {
	
    for (int i = 0; i < n; i++)
        cin >> pri[i];
    for (int i = 0; i < n; i++)
        cin >> temp, st[temp].insert(pri[i]);
    for (int i = 0; i < n; i++)
        cin >> temp, st[temp].insert(pri[i]);

    cin >> m;
    while (m--) {
        cin >> temp;
        if (st[temp].size() == 0) {
            cout << -1 << " ";
            continue;
        }
        temp = *(st[temp].begin());
        cout << temp << " ";
        for (int j = 1; j <= 3; j++)
            if ( st[j].find(temp)!= st[j].end())
                st[j].erase(st[j].find(temp));  
    }
    cout<<endl;
	}
    return 0;
}

一、队列(queue 先进先出)

头文件:#include <queue>

声明:queue<T>q;  (T 表示类型, q 表示变量名)

基本操作:

1、q.push(a) 在队列末尾加入一个元素a

2、q.pop() 删除队列q的第一个元素

3、q.front() 返回队列q的第一个元素

4、q.back()  返回队列q的最后一个元素

5、q.empty() 如果队列q为空则返回真

6、q.size()  返回队列q中元素的个数

 

 

二、优先队列(priority_queue)

头文件:#include <queue>

声明:priority_queue<T>q;  (默认从大到小排序)

priority_queue<T ,vector<T> ,greater<T> >  (从小到大排序)

对于优先队列里元素的一个结构体类型,可对比较函数进行重载,使其按照某一个属性排序

基本操作:

1、q.push(a) 在队列中加入一个元素

2、q.pop()

3、q.top()

4、q.size()

5、q.empty()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值