bzoj2223 [Coci 2009]PATULJCI
阿新 • • 發佈:2019-01-26
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;
}