标签:
Time Limit: 2 second(s) | Memory Limit: 64 MB |
All of you must have played the game ‘Diablo‘. It‘s an exclusive game to play. In this game the main opponent of you is Diablo. If you kill him the game finishes. But as usual, Diablo is smarter than you.
Diablo has a large number of army. Diablo arranges them in a line in any arbitrary order and everyone is given an integer id. Each time Diablo either adds one army in the end or he calls for the kth army (from left) from the line. Then the army gets out and it attacks you.
Since you are a great magician, you can read Diablo‘s mind. Now you want to find the id of the armies who are about to attack you.
Input starts with an integer T (≤ 5), denoting the number of test cases.
The first line of each case is a blank line. The next line contains two integers n (0 ≤ n ≤ 105), denoting the number of the initial army and q (1 ≤ q ≤ 50000) representing the number of queries. The next line contains n space separated integers. The ith integer of this line denotes the id of the ith person. Each of these integers will be positive and fits into a 32 bit signed integer. Each of the next q lines will contain a query, of the form:
a p (add a person at the end of the line whose id is p)
c k (call the kth person from the line (from left), k is a positive 32 bit signed integer)
For each case of input, print the case number in a line. Then for all the queries ‘c k‘ you have to print the id of the kth person or ‘none‘ if there is none.
Sample Input |
Output for Sample Input |
2
5 5 6 5 3 2 1 c 1 c 1 a 20 c 4 c 4
2 1 18811 1991 c 1 |
Case 1: 6 5 20 none Case 2: 18811 |
Dataset is huge, use faster i/o methods.
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 #include<queue> 6 #include<stack> 7 #include<map> 8 #include<math.h> 9 using namespace std; 10 typedef long long LL; 11 int tree[5000000]; 12 int ans[160005]; 13 int id[160000]; 14 int flag[160000]; 15 void build(int l,int r,int k,int u); 16 int ask(int l,int r,int k,int m); 17 void up(int k); 18 void in(int x); 19 int main(void) 20 { 21 int i,j,k; 22 scanf("%d",&k); 23 int s; 24 int n,m; 25 int gg=0; 26 for(s=1; s<=k; s++) 27 { 28 scanf("%d %d",&n,&m); 29 for(i=1; i<=n; i++) 30 { 31 scanf("%d",&ans[i]); 32 } 33 memset(flag,0,sizeof(flag)); 34 for(i=n+1; i<=160000; i++) 35 { 36 flag[i]=1; 37 } 38 build(1,160000,0,n); 39 gg=n; 40 int cn=n; 41 printf("Case %d:\n",s); 42 while(m--) 43 { 44 char a[2]; 45 int x; 46 scanf("%s %d",a,&x); 47 if(a[0]==‘c‘) 48 { 49 if(gg<x) 50 printf("none\n"); 51 else 52 { 53 int cc=ask(1,160000,0,x); 54 printf("%d\n",ans[cc]); 55 gg--; 56 } 57 } 58 else 59 { 60 cn++; 61 flag[cn]=0; 62 ans[cn]=x; 63 gg++; 64 in(cn); 65 } 66 } 67 } 68 return 0; 69 } 70 void build(int l,int r,int k,int u) 71 { 72 if(l==r) 73 { 74 if(r<=u) 75 { 76 id[l]=k; 77 tree[k]=1; 78 } 79 else 80 { 81 id[l]=k; 82 tree[k]=0; 83 } 84 return ; 85 } 86 else 87 { 88 build(l,(l+r)/2,2*k+1,u); 89 build((l+r)/2+1,r,2*k+2,u); 90 tree[k]=tree[2*k+1]+tree[2*k+2]; 91 } 92 } 93 int ask(int l,int r,int k,int ans) 94 { 95 if(ans==tree[k]) 96 { 97 int c=id[r]; 98 if(flag[r]==0) 99 { flag[r]=1; 100 up(c); 101 return r; 102 } 103 else 104 { 105 if(tree[2*k+1]<ans) 106 { 107 return ask((l+r)/2+1,r,2*k+2,ans-tree[2*k+1]); 108 } 109 else if(tree[2*k+1]==ans) 110 { 111 return ask(l,(l+r)/2,2*k+1,ans); 112 } 113 } 114 } 115 else if(ans<tree[k]) 116 { 117 if(tree[2*k+1]>=ans) 118 { 119 return ask(l,(l+r)/2,2*k+1,ans); 120 } 121 else if(tree[2*k+1]<ans) 122 { 123 return ask((l+r)/2+1,r,2*k+2,ans-tree[2*k+1]); 124 } 125 } 126 } 127 void up(int k) 128 { 129 tree[k]=0; 130 if(k==0)return ; 131 k=(k-1)/2; 132 while(k>=0) 133 { 134 tree[k]=tree[2*k+1]+tree[2*k+2]; 135 if(k==0) 136 return ; 137 k=(k-1)/2; 138 } 139 } 140 void in(int x) 141 { 142 int cc=id[x]; 143 tree[cc]=1; 144 if(cc==0)return ; 145 cc=(cc-1)/2; 146 while(cc>=0) 147 { 148 tree[cc]=tree[2*cc+1]+tree[2*cc+2]; 149 if(cc==0) 150 return ; 151 cc=(cc-1)/2; 152 } 153 }
标签:
原文地址:http://www.cnblogs.com/zzuli2sjy/p/5506518.html