http://acm.hdu.edu.cn/showproblem.php?pid=6375
思路:
直接用map映射双端队列,然后直接模拟就可以了。
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int mod=998244353;
const int maxn=3e5+10;
const ll inf=1e18;
map<int,deque<int> >q;
int n,m,w;
void read(int &x){
char ch = getchar();x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
q[i].clear();
int u,val,t;
while(m--)
{
read(t);
if(t==1)
{
read(u),read(w),read(val);
if(!w)q[u].push_front(val);
else q[u].push_back(val);
}
else if(t==2)
{
read(u),read(w);
if(q[u].empty())
{
printf("-1\n");continue;
}
if(!w)printf("%d\n",q[u].front()),q[u].pop_front();
else printf("%d\n",q[u].back()),q[u].pop_back();
}
else
{
read(u),read(val),read(w);
if(w){
q[u].insert(q[u].end(),q[val].rbegin(),q[val].rend()),q[val].clear();
}
else q[u].insert(q[u].end(),q[val].begin(),q[val].end()),q[val].clear();
}
}
}
return 0;
}