#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define Key_value ch[ch[root][1]][0] const int MAXN = 20010; int pre[MAXN],ch[MAXN][2],key[MAXN],size[MAXN]; int root; void NewNode(int &r,int father,int loc,int k) { r = loc; pre[r] = father; ch[r][0] = ch[r][1] = 0; key[r] = k; size[r] = 1; } void push_up(int r) { size[r] = size[ch[r][0]] + size[ch[r][1]] + 1; } void Init() { root = 0; ch[root][0] = ch[root][1] = key[root] = size[root] = 0; pre[root] = 0; } void Rotate(int x,int kind) { int y = pre[x]; ch[y][!kind] = ch[x][kind]; pre[ch[x][kind]] = y; if(pre[y]) ch[pre[y]][ch[pre[y]][1]==y] = x; pre[x] = pre[y]; ch[x][kind] = y; pre[y] = x; push_up(y); } void Splay(int r,int goal) { while(pre[r] != goal) { if(pre[pre[r]] == goal) Rotate(r,ch[pre[r]][0] == r); else { int y = pre[r]; int kind = ch[pre[y]][0]==y; if(ch[y][kind] == r) { Rotate(r,!kind); Rotate(r,kind); } else { Rotate(y,kind); Rotate(r,kind); } } } push_up(r); if(goal == 0) root = r; } int Get_kth(int r,int k) { int t = size[ch[r][0]] + 1; if(t == k)return r; if(t > k)return Get_kth(ch[r][0],k); else return Get_kth(ch[r][1],k-t); } void Insert(int loc,int k) { int r = root; if(r == 0) { NewNode(root,0,loc,k); return; } while(ch[r][key[r] size[t2]) swap(t1,t2); root = t2; erase(t1); } int main() { int N,M; int iCase = 0; while(scanf("%d%d",&N,&M) == 2 ) { if(N == 0 && M == 0) break; iCase++; memset(head,-1,sizeof(head)); tot = 0; int v; for(int i = 1;i <= N;i++) { scanf("%d",&v); add_value(i,v); } for(int i = 1;i <= M;i++) { scanf("%d%d",&edge[i].u,&edge[i].v); } q_num = 0; memset(used,false,sizeof(used)); while(scanf("%s",&query[q_num].op) == 1) { if(query[q_num].op[0] == 'E')break; if(query[q_num].op[0] == 'D') { scanf("%d",&query[q_num].x); used[query[q_num].x] = true; } else if(query[q_num].op[0] == 'Q') scanf("%d%d",&query[q_num].x,&query[q_num].y); else if(query[q_num].op[0] == 'C') { scanf("%d%d",&query[q_num].x,&query[q_num].y); add_value(query[q_num].x,query[q_num].y); } q_num++; } memset(F,-1,sizeof(F)); for(int i = 1;i <= N;i++) NewNode(root,0,i,to[head[i]]); for(int i = 1;i <= M;i++) if(!used[i]) bing(edge[i].u,edge[i].v); double ans = 0; int cnt = 0; for(int i = q_num-1; i>= 0 ;i--) { if(query[i].op[0] == 'Q') { Splay(query[i].x,0); if(size[root] < query[i].y || query[i].y <= 0) { cnt++; continue; } ans += key[Get_kth(root,size[root] - query[i].y + 1)]; cnt++; } else if(query[i].op[0] == 'D') { int tmp = query[i].x; bing(edge[tmp].u,edge[tmp].v); } else if(query[i].op[0] == 'C') { Splay(query[i].x,0); Delete(); head[query[i].x] = ne[head[query[i].x]]; Insert(query[i].x,to[head[query[i].x]]); } } if(cnt == 0)cnt = 1; printf("Case %d: %.6lf\n",iCase,ans/cnt); } return 0; }