#include #include #include #include #include #include #include #include using namespace std; #define L(id) tree[id].ch[0] #define R(id) tree[id].ch[1] #define Size(id) tree[id].size #define Father(id) tree[id].fa #define Val(id) tree[id].val #define ll int ll Mid(ll x,ll y){return (x+y)>>1;} #define N 30100 ll a[N], n; int ch[N][2],val[N],counts[N],r[N],size[N],tot,root; int Newnode(int &rt,int v) { rt=++tot; val[rt]=v; ch[rt][0]=ch[rt][1]=0; counts[rt]=size[rt]=1; r[rt]=rand(); return rt; } inline void PushUp(int rt) { size[rt]=size[ch[rt][0]]+size[ch[rt][1]]+counts[rt]; } void Rotate(int &x,int kind) { int y=ch[x][kind^1]; ch[x][kind^1]=ch[y][kind]; ch[y][kind]=x; PushUp(x);PushUp(y); x=y; } int Insert(int &rt,int v) { if(rt==0) return Newnode(rt,v); int ans; if(v==val[rt]) counts[rt]++, ans = rt; else { int kind=(v>val[rt]); ans = Insert(ch[rt][kind],v); if(r[ch[rt][kind]]=k) return select(ch[rt][0],k); if(size[ch[rt][0]]+counts[rt]>=k) return val[rt]; return select(ch[rt][1],k-size[ch[rt][0]]-counts[rt]); } void remove(int &rt,int v) { if(val[rt]==v) { if(counts[rt]>1) counts[rt]--; else if(!ch[rt][0]&&!ch[rt][1]) {rt=0;return ;} else { int kind=r[ch[rt][0]]val[rt]],v); PushUp(rt); } void Init() { ch[0][0]=ch[0][1]=0; size[0]=counts[0]=val[0]=0; tot=root=0; r[0]=(1LL<<31)-1; Newnode(root,2000000001); } int q[N]; int main(){ int que, i, j, k, l, r; while(~scanf("%d %d",&n,&que)){ Init(); for(i=1;i<=n;i++)scanf("%d",&a[i]); for(i=1;i<=que;i++)scanf("%d",&q[i]); int s = 1, cnt = 0; for(i=1;i<=n;i++) { Insert(root, a[i]); if(s>n)break; while(size[root]-1 == q[s]) { printf("%d\n",select(root,++cnt)); s++; } } } return 0; } /* 7 3 1 5 2 6 3 7 4 2 5 3 4 4 1 1 7 3 */
strlen() 和 strcpy()函數的區別,這兩個一個
1、問題描速:  
[cpp] #if 1 #
C++聚合關系類的構造函數的調用順序,聚合構造函數如圖,表示
EOF是什麼?,EOF轉自http://www.ruanyi
josephus問題是c++中的一個經典題目,在正式