合并时要注意要求
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <map>
#include <vector>
using namespace std;
#define MAXN 10001
int fa[MAXN];
int pow[MAXN];
int a[22222], b[22222];
int ans[22222];
map<pair<int,int>, bool> vis;
struct opera
{
char str[10];
int a, b;
}ope[50005];
int findfa( int x)
{
if(fa[x] == -1) return x;
return fa[x] = findfa(fa[x]);
}
void unit(int x, int y)
{
int fax = findfa(x);
int fay = findfa(y);
if(fax != fay)
{
if(pow[fax] < pow[fay])
fa[fax] = fay;
else if(pow[fax] > pow[fay])
fa[fay] = fax;
else if(fax < fay)
fa[fay] = fax;
else
fa[fax] = fay;
}
}
int main()
{
int n, val;
char str[11];
int m, u, v, op;
int ca = 0;
while(scanf("%d",&n) != EOF)
{
vis.clear();
ca++;
memset(fa, -1, sizeof(fa));
if(ca > 1)
printf("\n");
for(int i = 0; i < n; i++)
scanf("%d",&pow[i]);
scanf("%d",&m);
for(int i = 0; i < m; i++)
{
scanf("%d %d",&a[i], &b[i]);
if(a[i] > b[i])
swap(a[i], b[i]);
}
scanf("%d",&op);
for( int i = 0; i < op ;i++)
{
cin>>ope[i].str;
if(ope[i].str[0] == 'q')
scanf("%d",&ope[i].a);
else
{
scanf("%d %d",&ope[i].a, &ope[i].b);
if(ope[i].a > ope[i].b) swap(ope[i].a, ope[i].b);
vis[make_pair(ope[i].a, ope[i].b)] = 1;
}
}
for( int i = 0; i < m; i++)
{
if(!vis[make_pair(a[i],b[i])])
unit(a[i],b[i]);
}
int cnt = 0;
for(int i = op-1; i >= 0; i--)
{
if(ope[i].str[0] == 'd')
unit(ope[i].a, ope[i].b);
else
{
int fax = findfa(ope[i].a);
if( pow[fax] > pow[ope[i].a])
ans[cnt++] = fax;
else
ans[cnt++] = -1;
}
}
for( int i = cnt-1; i >= 0; i--)
printf("%d\n",ans[i]);
}
return 0;
}