1. 程式人生 > >bzoj2223 [Coci 2009]PATULJCI

bzoj2223 [Coci 2009]PATULJCI

Description

這裡寫圖片描述

Solution

第一眼莫隊啊,敲完發現還要線段樹統計,那還不如直接上主席樹qaq

Code

#include <stdio.h>
#include <string.h>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)

const int N=600005;

struct treeNode {int l,r,sum;} t[N*11];
int a[N],root[N];
int cnt;

void modify(int pre,int &now,int tl,int
tr,int x) { t[now=++cnt]=t[pre]; t[now].sum++; if (tl==tr) return ; int mid=(tl+tr)>>1; if (x<=mid) modify(t[pre].l,t[now].l,tl,mid,x); else modify(t[pre].r,t[now].r,mid+1,tr,x); } int query(int pre,int now,int tl,int tr,int x) { if (tl==tr) return tl; int wl=t[t[now].l].sum-t[t[pre].l].sum; int
wr=t[t[now].r].sum-t[t[pre].r].sum; int mid=(tl+tr)>>1; if (wl>x) return query(t[pre].l,t[now].l,tl,mid,x); if (wr>x) return query(t[pre].r,t[now].r,mid+1,tr,x); return -1; } int main(void) { int n,lim; scanf("%d%d",&n,&lim); root[0]=cnt=1; rep(i,1,n) { scanf
("%d",&a[i]); modify(root[i-1],root[i],1,lim,a[i]); } int m; scanf("%d",&m); rep(i,1,m) { int l,r; scanf("%d%d",&l,&r); int ret=query(root[l-1],root[r],1,lim,(r-l+1)/2); if (ret==-1) puts("no"); else printf("yes %d\n", ret); } return 0; }