<i id="yupd0"></i>
  • <i id="yupd0"></i>
  • <thead id="yupd0"></thead>
    <blockquote id="yupd0"></blockquote>
    <i id="yupd0"></i>
  • 碼迷,www.greeshyz.com
    首頁 > 其他好文 > 詳細

    可持久化練習

    時間:2020-07-23 23:30:13      閱讀:55      評論:0      收藏:0      [點我收藏+]

    標簽:sum   def   tree   info   線段   拷貝   alt   src   ffffff   

    先挖坑,過幾天填

    https://www.luogu.com.cn/training/14535#problems

    可持久化數組

    P3919 【模板】可持久化線段樹 1(可持久化數組)

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e6+10;
    int nodecnt;
    int tree[maxn*30],ls[maxn*30],rs[maxn*30];
    int root[maxn],a[maxn];
    int maketree(int rt,int l,int r){//建樹
    	rt=++nodecnt;
    	if(l==r){
    		tree[rt]=a[l];
    		return nodecnt;
    	}
    	int mid=(l+r)>>1;
    	ls[rt]=maketree(ls[rt],l,mid);
    	rs[rt]=maketree(rs[rt],mid+1,r);
    	return rt;
    }
    int get(int rt){//拷貝原節點信息
    	nodecnt++;
    	tree[nodecnt]=tree[rt];
    	ls[nodecnt]=ls[rt];
    	rs[nodecnt]=rs[rt];
    	return nodecnt;
    }
    int update(int rt,int l,int r,int x,int val){
    	rt=get(rt);
    	if(l==r){
    		tree[rt]=val;
    	}else{
    		int mid=(l+r)>>1;
    		if(x<=mid)ls[rt]=update(ls[rt],l,mid,x,val);
    		else rs[rt]=update(rs[rt],mid+1,r,x,val);
    	}
    	return rt;
    }
    int query(int rt,int l,int r,int x){//查詢操作
    	if(l==r)return tree[rt];
    	int mid=(l+r)>>1;
    	if(x<=mid)return query(ls[rt],l,mid,x);
    	return query(rs[rt],mid+1,r,x);
    }
    inline int read(){
       int s=0,w=1;
       char ch=getchar();
       while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)w=-1;ch=getchar();}
       while(ch>=‘0‘&&ch<=‘9‘) s=s*10+ch-‘0‘,ch=getchar();
       return s*w;
    }
    
    int main(){
    	int n,m;
    	n=read(),m=read();
    	for(int i=1;i<=n;i++)a[i]=read();
    	root[0]=maketree(0,1,n);//建原始版本線段樹
    	for(int i=1;i<=m;i++){
    		int rt,op,x;
    		rt=read(),op=read(),x=read();
    		if(op==1){
    			int y;
    			y=read();
    			root[i]=update(root[rt],1,n,x,y);//構建新節點線段樹的log(n)個節點
    		}
    		else{
    			printf("%d\n",query(root[rt],1,n,x));
    			root[i]=root[rt];//建立新版本,當前版本和查詢版本一致
    		}
    	}
    } 
    

    可持久化線段樹

    P3834 【模板】可持久化線段樹 2(主席樹)

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=200010;
    int p;
    int nodecnt;//實現動態開點
    int a[maxn],b[maxn],n,m;//a是原數組,b是離散化數組
    int size[maxn<<5],root[maxn],rs[maxn<<5],ls[maxn<<5];//size記錄節點大小,root記錄每一棵樹的根,ls-->左兒子,rs-->右兒子
    void build(int &rt,int l,int r){//間一棵空樹
    //引用,順便修改,實現動態開點
    	rt=++nodecnt;
    	if(l==r){return;}
    	int mid=(l+r)>>1;
    	build(ls[rt],l,mid);
    	build(rs[rt],mid+1,r);
    }
    int get(int rt){//繼承該節點原版本的全部信息
    	nodecnt++;
    	ls[nodecnt]=ls[rt];
    	rs[nodecnt]=rs[rt];
    	size[nodecnt]=size[rt]+1;
    	return nodecnt;
    }
    int modify(int rt,int l,int r){//通過rt(上一棵樹的根節點)構建當前樹
    	rt=get(rt);//繼承
    	if(l==r)return rt;//返回當前節點的編號
    	int mid=(l+r)>>1;
    	if(p<=mid)ls[rt]=modify(ls[rt],l,mid);//記錄下面節點返回的編號
    	else rs[rt]=modify(rs[rt],mid+1,r);
    	return rt;//返回當前節點的編號
    }
    int query(int u,int v,int l,int r,int k){
    	int ans;
    	int mid=(l+r)>>1;
    	int x=size[ls[v]]-size[ls[u]];//記錄在l到r中左子樹(l~mid)添加的數字的個數
    	if(l==r)return l;//到葉子節點,返回答案
    	if(x>=k)ans=query(ls[u],ls[v],l,mid,k);//大于則說明左子樹添加的節點數大于k,那么區間第k小在左側
    	else ans=query(rs[u],rs[v],mid+1,r,k-x);//區間第k小在右側
    	return ans;
    }
    int main(){
    	int l,r,k,q,ans;
        scanf("%d%d", &n, &m);
    	for(int i=1;i<=n;i++){
    		scanf("%d",&a[i]);
    		b[i]=a[i];//離散化數組
    	}
    	sort(b+1,b+1+n);//排序
    	q=unique(b+1,b+n+1)-b-1;//去重
    	build(root[0],1,q);//構建空樹
    	for(int i=1;i<=n;i++){
    		p=lower_bound(b+1,b+q+1,a[i])-b;//查找a[i]離散化后的大小(在b數組中的位置)
    		root[i]=modify(root[i-1],1,q);//根據第i-1棵線段樹構建第i棵線段樹
    	}
    	while(m--){
    		int l,r,k;
    		scanf("%d%d%d",&l,&r,&k);
    		int ans=query(root[l-1],root[r],1,q,k);//查詢l,r中的區間k小
    		//和前綴和類似,從樹l-1到r查詢
    		printf("%d\n",b[ans]);//輸出原數據
    	}
    	
    }
    

    可持久化平衡樹

    P3835 【模板】可持久化平衡樹
    (維護歷史版本的修改查詢,這里提供線段樹做法)

    對值域開+動態開點

    調了好長時間,一直28分,后來發現,竟然可以刪除不存在的節點????(大霧)-->>加判斷

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int maxn=5e5+10;
    int size[maxn*30];
    int ls[maxn*30],rs[maxn*30],root[maxn];
    int nodecnt;
    int get(int rt){
    	++nodecnt;
    	ls[nodecnt]=ls[rt];
    	rs[nodecnt]=rs[rt];
    	size[nodecnt]=size[rt];
    	return nodecnt;
    }
    void add(int &rt,int l,int r,int x,int v){
    	if(rt!=0)rt=get(rt);
    	else if(rt==0)rt=++nodecnt;
    	size[rt]+=v;
    	if(l==r){
    		if(size[rt]<0)size[rt]=0;	
    		return;
    	}
    	int mid=(l+r)>>1;
    	if(x<=mid)add(ls[rt],l,mid,x,v);
    	else add(rs[rt],mid+1,r,x,v);
    	size[rt]=size[ls[rt]]+size[rs[rt]];
    }
    int getnum(int rt,int l,int r,int x){
    	if(size[rt]==0||x>r){
    		return size[rt];
    	}
    	int mid=(l+r)>>1;
    	if(x<=mid)return getnum(ls[rt],l,mid,x);
    	return size[ls[rt]]+getnum(rs[rt],mid+1,r,x);
    }
    int getk(int rt,int l,int r,int k){
    	if(l==r)return l;
    	int mid=(l+r)>>1;
    	if(size[ls[rt]]>=k)return getk(ls[rt],l,mid,k);
    	return getk(rs[rt],mid+1,r,k-size[ls[rt]]);
    }
    signed main(){
    	int n;
    	scanf("%lld",&n);
    	root[0]=++nodecnt;
    	for(int i=1;i<=n;i++){
    		int rt,op,x;
    		scanf("%lld%lld%lld",&rt,&op,&x);
    		root[i]=root[rt];
    		if(op==1){
    			add(root[i],-1e9,1e9+1,x,1);
    		}
    		if(op==2){
    			add(root[i],-1e9,1e9+1,x,-1);
    		}
    		if(op==3){
    			printf("%lld\n",getnum(root[i],-1e9,1e9+1,x)+1);
    		}
    		if(op==4){
    			printf("%lld\n",getk(root[i],-1e9,1e9+1,x));
    		}
    		if(op==5){
    			int ans=getnum(root[i],-1e9,1e9+1,x);
    			if(ans==0)printf("%d\n",-0x7fffffff);
    			else printf("%lld\n",getk(root[i],-1e9,1e9+1,ans));
    		}
    		if(op==6){
    			int ans=getk(root[i],-1e9,1e9+1, getnum(root[i],-1e9,1e9+1,x +1)+1);
    			if(ans==1e9+1)printf("%d\n",0x7fffffff);
    			else printf("%lld\n",ans);
    		}
    	}
    
    }
    

    對數組開+離線操作+離散化

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=5e5+10;
    int nodecnt;
    struct node{
    	int v,op,x;
    }temp[maxn];
    int tmp[maxn],tail;
    int rs[maxn*32],ls[maxn*32],size[maxn*32],root[maxn];
    int n;
    
    void build(int &curr, int l, int r) {
        curr = ++nodecnt;
        if (l == r) return;
        int mid = (l + r) >> 1;
        build(ls[curr], l, mid);
        build(rs[curr], mid + 1, r);
    }
    int get(int rt){
    	nodecnt++;
    	ls[nodecnt]=ls[rt];
    	rs[nodecnt]=rs[rt];
    	size[nodecnt]=size[rt];
    	return nodecnt;
    }
    void add(int &rt,int l,int r,int x,int v){
    	rt=get(rt);
    	if(l==r){
    		size[rt]+=v;
    		if(size[rt]<0)size[rt]=0;
    		return;
    	}
    	int mid=(l+r)>>1;
    	if(x<=mid)add(ls[rt],l,mid,x,v);
    	else add(rs[rt],mid+1,r,x,v);
    	size[rt]=size[ls[rt]]+size[rs[rt]];
    }
    
    int opuerysum(int rt,int l,int r,int x){
    	if(x<l)return 0;
    	if(x>=r)return size[rt];
    	int mid=(l+r)>>1;
    	return opuerysum(ls[rt],l,mid,x)+opuerysum(rs[rt],mid+1,r,x);
    }
    
    int opuerykth(int rt,int l,int r,int k){
    	if(l==r)return l;
    	int mid=(l+r)>>1;
    	if(k<=size[ls[rt]])return opuerykth(ls[rt],l,mid,k);
    	else return opuerykth(rs[rt],mid+1,r,k-size[ls[rt]]);
    }
    
    int opuerypre(int v,int x){
    	int ans=opuerysum(root[v],1,tail,x-1);
    	if(!ans)return -2147483647;
    	else return tmp[opuerykth(root[v],1,tail,ans)];
    
    }
    int opuerysucc(int v,int x){
    	int ans=opuerysum(root[v],1,tail,x);
    	if(ans>=size[root[v]])return 2147483647;
    	else return tmp[opuerykth(root[v],1,tail,ans+1)];
    }
    int main(){
    	int n;
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++){
    		scanf("%d%d%d",&temp[i].v,&temp[i].op,&temp[i].x);
    		if(temp[i].op!=4){
    			tmp[++tail]=temp[i].x;
    		}
    	}
    	sort(tmp+1,tmp+tail+1);
    	tail=unique(tmp+1,tmp+tail+1)-(tmp+1);
    	build(root[0],1,tail);
    	for(int i=1;i<=n;i++){
    		int v=temp[i].v,op=temp[i].op,x=temp[i].x;
    		if(op!=4){x=lower_bound(tmp+1,tmp+tail+1,x)-tmp;}
    		root[i]=root[v];
    		if(op==1){	
    			add(root[i],1,tail,x,1);
    		}
    		if(op==2){
    			add(root[i],1,tail,x,-1);
    		}
    		if(op==3){
    			printf("%d\n",opuerysum(root[i],1,tail,x-1)+1);
    		}
    		if(op==4){
    			printf("%d\n",tmp[opuerykth(root[i],1,tail,x)]);
    		}
    		if(op==5){
    			printf("%d\n",opuerypre(i,x));
    		}
    		if(op==6){
    			printf("%d\n",opuerysucc(i,x));
    		}
    	}
    	
    }
    
    

    可持續化Trie

    P4735 最大異或和

    #include<bits/stdc++.h>
    using namespace std;
    const int N=6e5+10;
    int nodecnt;
    int tree[N*24][2],latest[N*24];
    int s[N],root[N],n,m;
    void get(int rt,int last){
    	tree[rt][1]=tree[last][1];
    	tree[rt][0]=tree[last][0];
    	latest[rt]=latest[last];
    }
    void insert(int rt,int last,int i,int k){
    	get(rt,last);
    	if(k<0){
    		latest[rt]=i;
    		return;
    	}
    	bool rel=s[i]>>k&1;
    	tree[rt][rel]=++nodecnt;
    	insert(tree[rt][rel],tree[last][rel],i,k-1);
    	latest[rt]=max(latest[tree[rt][0]],latest[tree[rt][1]]);
    }
    int ask(int rt,int val,int k,int lim){
    	if(k<0)return s[latest[rt]]^val;
    	int rel=val>>k&1;
    	if(latest[tree[rt][rel^1]]>=lim)
    		return ask(tree[rt][rel^1],val,k-1,lim);
    	else 
    		return ask(tree[rt][rel],val,k-1,lim);
    }
    int main(){
    	scanf("%d%d",&n,&m);
    	latest[0]=-1;
    	root[0]=++nodecnt;
    	insert(root[0],0,0,23);
    	for(int i=1;i<=n;i++){
    		int x;scanf("%d",&x);
    		s[i]=s[i-1]^x;
    		root[i]=++nodecnt;
    		insert(root[i],root[i-1],i,23);
    	}
    	for(int i=1;i<=m;i++){				
    		char op;
    		scanf(" %c",&op);
    		if(op==‘A‘){
    			int x;scanf("%d",&x);
    			root[++n]=++nodecnt;
    			s[n]=s[n-1]^x;
    			insert(root[n],root[n-1],n,23);
    		}
    		else{
    			int l,r,x;
    			scanf("%d%d%d",&l,&r,&x);
    			printf("%d\n",ask(root[r-1],x^s[n],23,l-1));
    		}
    		
    	}
    }
    

    可持久化并查集

    可持久化數組維護可持久化并查集??

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=200050;
    int n,m,nodecnt;
    int dep[maxn*30],fa[maxn*30],root[maxn],rs[maxn*30],ls[maxn*30];
    inline int read(){
       int s=0,w=1;
       char ch=getchar();
       while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)w=-1;ch=getchar();}
       while(ch>=‘0‘&&ch<=‘9‘) s=s*10+ch-‘0‘,ch=getchar();
       return s*w;
    }
    void build(int &rt,int l,int r){
    	if(!rt)rt=++nodecnt;
    	if(l==r){fa[rt]=l;return;}
    	int mid=(l+r)>>1;
    	build(ls[rt],l,mid);build(rs[rt],mid+1,r);
    }
    void update(int &rt,int pre,int l,int r,int x,int y){
    	rt=++nodecnt;
    	if(l==r){
    		dep[rt]=dep[pre];
    		fa[rt]=y;
    		return;
    	}
    	ls[rt]=ls[pre],rs[rt]=rs[pre];
    	int mid=(l+r)>>1;
    	if(x<=mid)update(ls[rt],ls[pre],l,mid,x,y);
    	else update(rs[rt],rs[pre],mid+1,r,x,y);
    }
    int query(int rt,int l,int r,int x){
        if(l==r)return rt;
        int mid=(l+r)>>1;
        if(x<=mid)return query(ls[rt],l,mid,x);
        else return query(rs[rt],mid+1,r,x);
    }
    void add(int rt,int l,int r,int x){
    	if(l==r){dep[rt]++;return;}
    	int mid=(l+r)>>1;
    	if(x<=mid)add(ls[rt],l,mid,x);
    	else add(rs[rt],mid+1,r,x);
    }
    
    int find_root(int rt,int now){
    	int nowx=query(rt,1,n,now);
    	if(fa[nowx]==now)return nowx;
    	return find_root(rt,fa[nowx]);
    }
    int main(){
    	n=read(),m=read();
    	build(root[0],1,n);
    	for(int i=1;i<=m;i++){
    		int op;
    		op=read();
    		if(op==1){
    			root[i]=root[i-1];
    			int x=read(),y=read();
    			int fx=find_root(root[i],x),fy=find_root(root[i],y);
    			if(fa[fx]==fa[fy])continue;
    			if(dep[fx]>dep[fy])swap(fx,fy);
    			update(root[i],root[i-1],1,n,fa[fx],fa[fy]);
    			if(dep[fx]+1>dep[fy])add(root[i],1,n,fa[fy]);
    		}
    		if(op==2){
    			int kx=read();
    			root[i]=root[kx];
    		}
    		if(op==3){
    			root[i]=root[i-1];
    			int x=read(),y=read();
    			int fx=find_root(root[i],x),fy=find_root(root[i],y);
    			if(fa[fx]==fa[fy])puts("1");
    			else puts("0");
    		}
    	}
    }
    

    填坑完

    技術圖片

    可持久化練習

    標簽:sum   def   tree   info   線段   拷貝   alt   src   ffffff   

    原文地址:https://www.cnblogs.com/soda-ma/p/13358503.html

    (0)
    (0)
       
    舉報
    評論 一句話評論(0
    登錄后才能評論!
    迷上了代碼!
    91色国产论坛,久草99福利资源,青青草在线华人,99热在线视频观看免费,青青草a片免费看,青青草av视频导航,香蕉网站伊人大香蕉 青青碰人青青草免费 国产自拍偷拍在线播放 青青草华人在线av 伊人影院在线大香 无码大香蕉网伊人色 久久大香蕉视频网 青草精品资源在线 伊人大香蕉在线精品 97资源总站久久爱视频 自拍中文字幕 青青草手机在线视频 青青草久久爱大香蕉 国产青青草自拍 伊人大香蕉在线精品 97资源总站久久爱视频 自拍中文字幕 av图片在线看 久草视频福利免费资源站 自拍国产视频在线 www.琪琪色 爱色影爱色搞搞 97资源库 大香萑a久草视频 久草在线福利资站 青青草成人在线免费视频 久久精品国can视频在热 99热国产情侣偷拍 国产自拍 在线 凹凸分类视频97免费 av啪啪中文网站 青青草91自拍视频 奇米影视第四色 国产无限制自拍 大香蕉伊人精品在线 久久手机看片国产免费 无码大香蕉网伊人色 亚洲激情色 久草99福利资源 狼人色终合网站 91色国产色去色 2019奇米777奇米网 久久草妹妹色 米奇影院888奇米色 青青青草成人免费现看 超碰自拍 在线99热这里精品 色琪琪永久无码 伊人大香蕉成人视频综合 国产自拍视频在线 大香蕉伊人久操在线 青青草久草热久久草 偷拍自拍第四色 奇米网电影网 超碰99久久天天拍日日操 天天拍天天拍久草片 激情图片,激情小说 超碰碰av大香蕉伊人 久草97大香蕉伊人 美女伊人色情香蕉网站 青青草华人免费视频在线 大香蕉伊人久草视频 奇米网在线手机在线 青草七次郞视频观看 青青草公开在线观看 狠狠夜夜干大香蕉伊人 777奇米网 日逼视频网站 欧美人和动物XXX 大香蕉色 欧美 国产 奇米影院首页 大香蕉伊人久久爱在线 青青青草免费手机播放 国产青青草 欧美一级黑寡妇夜夜干 啪啪 国产精品 东方aⅴ在线看 手机看A片 777米奇色狠狠俺去啦 香蕉网站伊人中文字幕 久操在线新免费视频 伊人影院在线大香 大香蕉成人伊人在线视频 青青草成人在线视频观看 91国产自拍偷拍视频 青青草色爱久久 精品国产自拍 小色狗 琪琪热热色无码 影音先锋大香蕉久草资源 小明视频看看成人免费 俺去了色网婷婷色 久久色情片 超碰在线青青草 超碰视频起碰视频 国产偷拍自拍影音先锋 小明视频看看成人免费 俺去了色网婷婷色 久久色情片 超碰在线青青草 超碰视频起碰视频 国产偷拍自拍影音先锋 老鸭窝在线视频 www.奇米在线四色 老版本日本怡春院 强奸乱伦在线观看 青青草在观视频 色琪琪在线视频原网 欧美色色大香焦 欧美色热图 亚洲香蕉手机在线观看视频 偷拍偷窥自拍网站 超91在线观看 最新奇米奇色777在线 婷婷网站 微拍秒拍福利视频 自拍在线 精品视频 欧美情色无码在线 久草激情视频 午夜高清影院在线观看 第四色青娱乐奇米影视 青青草在线综合 99热这里有精品 自拍偷拍影音先锋 国产自拍 先锋影音 成人在线视频97 久草在线免费观看大香蕉 99er久久国产精品在线 精品国产在线偷拍 啪啪青青草视频 国内偷拍 亚洲 大香蕉成人手机在线 在线伊人大香蕉手机版 久草伊人久草视频 伊人久久青青草综合网 青青草手机在线视频 青青草久久爱大香蕉 国产青青草自拍 伊人大香蕉在线精品 97资源总站久久爱视频 自拍中文字幕 av图片在线看 久草视频福利免费资源站 自拍国产视频在线 www.琪琪色 爱色影爱色搞搞 97资源库 大香蕉在线视频免费观看 a片直播妹子在线视频 a.v在线视频 开心五月色婷婷免费 香蕉福利视频在线观 青青草成人+激情偷拍 青青草视频大香蕉伊人网 av啪啪中文网站 青青草91自拍视频 奇米影视第四色 国产无限制自拍 大香蕉伊人精品在线 久久手机看片国产免费 无码大香蕉网伊人色 亚洲激情色 久草99福利资源 狼人色终合网站 91色国产色去色 2019奇米777奇米网 久久草妹妹色 米奇影院888奇米色 青青青草成人免费现看 超碰自拍 在线99热这里精品 色琪琪永久无码 伊人大香蕉成人视频综合 国产自拍视频在线 大香蕉伊人久操在线 青青草久草热久久草 偷拍自拍第四色 奇米网电影网 超碰99久久天天拍日日操 天天拍天天拍久草片 激情图片,激情小说 青青草久草热久久草 偷拍自拍第四色 奇米网电影网 超碰99久久天天拍日日操 天天拍天天拍久草片 操好屌色 米奇先锋 久草 偷拍 亚洲,偷拍,自拍,精品 伊人大香蕉综合色 大香蕉久久久 成人色啪啪 大香蕉色看片 欧美自拍在线 久久色综合网站xoxo 久热草大香蕉在线视频 久久大香蕉视频网 肏逼免费视频在线 网友自拍偷拍 欧美 国产 奇米影院首页 大香蕉伊人久久爱在线 青青青草免费手机播放 国产青青草 欧美一级黑寡妇夜夜干 啪啪 国产精品 东方aⅴ在线看 手机看A片 777米奇色狠狠俺去啦 香蕉网站伊人中文字幕 久操在线新免费视频 伊人影院在线大香 大香蕉成人伊人在线视频 青青草成人在线视频观看 91国产自拍偷拍视频 青青草色爱久久 精品国产自拍 小色狗 琪琪热热色无码 影音先锋大香蕉久草资源 小明视频看看成人免费 俺去了色网婷婷色 久久色情片 超碰在线青青草 欧美激情图片 自拍超碰 久草视频在线 天天 综合色伊人网 大香蕉视频成人中文网 大香蕉伊人欧美色 久热在线播放中文字幕 青青草久草福利 欧美色色大香焦 欧美色热图 亚洲香蕉手机在线观看视频 偷拍偷窥自拍网站 超91在线观看 最新奇米奇色777在线 婷婷网站 微拍秒拍福利视频 自拍在线 精品视频 欧美情色无码在线 久草激情视频 午夜高清影院在线观看 第四色青娱乐奇米影视 青青草在线综合 99热这里有精品 自拍偷拍影音先锋 国产自拍 先锋影音 成人在线视频97 久草在线免费观看大香蕉 99er久久国产精品在线
    久久草2019在线观看 99这里有精品 大香蕉免费公开青青草 狠狠色丁香婷婷综合 国产久草福利手机在线 青青草黄色三级网站 大香蕉他也啪 青青草视频大香蕉伊人网 久久爱大香焦在线视频 日本有码视频 成人视屏 国产精品91在线 91国产自拍小视频 伊人狼人香蕉网小说 青青草香蕉草久在线 av青青操 亚洲自拍欧美 91 国产 在线 97超碰资源共享 青青草伊人大香蕉 奇米四色网 国産偷拍91 精品国产在线自拍 伊人大香蕉色琪琪影院 caoprom超碰 青青视频在线视频 开心五月婷婷色婷在线 第四色色 Caoprom超碰视频 亚洲图片欧美图色姐 天天干情色网 操妹妹干妹妹 丁香五月婷婷伊人大香蕉 国产精品自拍偷拍在线 青青青成人社区 成人av在线 碰碰视频在线免费播放 影音先锋 小说色 久久草大香蕉 亚洲情色狼人网 思思久久re热线播放 久久草超碰 播播影院私人影院 大香蕉他也啪 米奇影视 成人国产老鸭窝 伊人大香蕉久久天天啪 男人的天堂 国产精品自偷拍 很很鲁在线97