【BZOJ】【2223】【COCI 2009】PATULJCI
可持久化线段树
同BZOJ 3524,但是不要像我一样直接贴代码……TAT白白WA了一次,so sad
1 /************************************************************** 2 Problem: 2223 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:804 ms 7 Memory:73932 kb 8 ****************************************************************/ 9 10 //BZOJ 2223 11 #include<cmath> 12 #include<vector> 13 #include<cstdio> 14 #include<cstring> 15 #include<cstdlib> 16 #include<iostream> 17 #include<algorithm> 18 #define rep(i,n) for(int i=0;i<n;++i) 19 #define F(i,j,n) for(int i=j;i<=n;++i) 20 #define D(i,j,n) for(int i=j;i>=n;--i) 21 #define pb push_back 22 #define CC(a,b) memset(a,b,sizeof(a)) 23 using namespace std; 24 int getint(){ 25 int v=0,sign=1; char ch=getchar(); 26 while(!isdigit(ch)) {if(ch=='-') sign=-1; ch=getchar();} 27 while(isdigit(ch)) {v=v*10+ch-'0'; ch=getchar();} 28 return v*sign; 29 } 30 const int N=300010,INF=~0u>>2; 31 const double eps=1e-8; 32 /*******************template********************/ 33 int n,m,Lim,a[N]; 34 35 struct Tree{ 36 int cnt,l,r; 37 }t[N*20]; 38 int root[N],cnt; 39 #define mid (l+r>>1) 40 void update(int &o,int l,int r,int pos){ 41 t[++cnt]=t[o]; o=cnt; ++t[o].cnt; 42 if (l==r) return; 43 if (pos<=mid) update(t[o].l,l,mid,pos); 44 else update(t[o].r,mid+1,r,pos); 45 } 46 int query(int i,int j,int num){ 47 i=root[i],j=root[j]; 48 int l=1,r=Lim; 49 while(l!=r){ 50 if(t[t[j].l].cnt-t[t[i].l].cnt>num) 51 r=mid,j=t[j].l,i=t[i].l; 52 else if(t[t[j].r].cnt-t[t[i].r].cnt>num) 53 l=mid+1,j=t[j].r,i=t[i].r; 54 else return 0; 55 } 56 return l; 57 } 58 #undef mid 59 int main(){ 60 #ifndef ONLINE_JUDGE 61 freopen("input.txt","r",stdin); 62 // freopen("output.txt","w",stdout); 63 #endif 64 n=getint(); Lim=getint(); 65 F(i,1,n) a[i]=getint(); 66 F(i,1,n){ 67 root[i]=root[i-1]; 68 update(root[i],1,Lim,a[i]); 69 } 70 m=getint(); 71 F(i,1,m){ 72 int l=getint(),r=getint(); 73 int ans=query(l-1,r,(r-l+1)>>1); 74 if (ans) printf("yes %d\n",ans); 75 else puts("no"); 76 } 77 return 0; 78 }