今晚整理了一下主席树,拿这题试验模版,速度有些慢,是我写挫了么?
#include <algorithm> #include <iostream> #include <fstream> #include <sstream> #include <iomanip> #include <map> #include <set> #include <list> #include <stack> #include <queue> #include <deque> #include <vector> #include <string> #include <bitset> #include <memory> #include <complex> #include <numeric> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <time.h> #include <ctype.h> #include <locale.h> using namespace std; #pragma pack(4) const double eps = 1e-8; const double pi = acos(-1.0); const int inf = 0x7f7f7f7f; #define loop(a,n) \ for(int i=0;n>i;i++) \ cout<<a[i]<<(i!=n-1?' ':'\n') #define loop2(a,n,m) \ for(int i=0;n>i;i++) \ for(int j=0;m>j;j++) \ cout<<a[i][j]<<(j!=m-1?' ':'\n') #define at(a,i) ((a)&(1<<(i))) #define nt(a,i) ((a)^(1<<(i))) #define set1(a,i) ((a)|(1<<(i))) #define set0(a,i) ((a)&(~(1<<(i)))) #define gret(a,b) (((a)-(b))>eps) #define less(a,b) (((b)-(a))>eps) #define greq(a,b) (((a)-(b))>-eps) #define leeq(a,b) (((b)-(a))>-eps) #define equl(a,b) (fabs((a)-(b))<eps) #define lmax(a,b) ((a)>(b)?(a):(b)) #define lmin(a,b) ((a)<(b)?(a):(b)) #define fmax(a,b) (gret(a,b)?(a):(b)) #define fmin(a,b) (less(a,b)?(a):(b)) const int MAXV = 100002; class CMT { private: struct node { int s; node *c[2]; int ls(void) { return this?c[0]->size():0; } int rs(void) { return this?c[1]->size():0; } int size(void) { return this?s:0; } }pool[MAXV*40],*a[MAXV],*c[33],*d[33]; int use,left,right,amount; node *malloc(node *root,int w) { node *now=&pool[use++]; if(!root) { now->s=w; now->c[0]=NULL; now->c[1]=NULL; } else { now->s=w+root->s; now->c[0]=root->c[0]; now->c[1]=root->c[1]; } return now; } int query(int k,int lc,int ld,int l,int r) { if(l==r) return l; else { int sum=0; for(int i=0;lc>i;i++) if(c[i]) sum-=c[i]->ls(); for(int i=0;ld>i;i++) if(d[i]) sum+=d[i]->ls(); if(sum>=k) { for(int i=0;lc>i;i++) if(c[i]) c[i]=c[i]->c[0]; for(int i=0;ld>i;i++) if(d[i]) d[i]=d[i]->c[0]; return query(k,lc,ld,l,(l+r)/2); } else { for(int i=0;lc>i;i++) if(c[i]) c[i]=c[i]->c[1]; for(int i=0;ld>i;i++) if(d[i]) d[i]=d[i]->c[1]; return query(k-sum,lc,ld,(l+r)/2+1,r); } } } node *insert(node *root,int x,int w,int l,int r) { root=malloc(root,w); if(l!=r) { if(x<=(l+r)/2) root->c[0]=insert(root->c[0],x,w,l,(l+r)/2); if((l+r)/2<x) root->c[1]=insert(root->c[1],x,w,(l+r)/2+1,r); } return root; } public: void clear(int n,int l,int r) { use=0; left=l; right=r; amount=n; for(int i=0;n>=i;i++) a[i]=NULL; } int query(int x,int y,int k) { int lc=0,ld=0; c[lc++]=a[x]; d[ld++]=a[y]; return query(k,lc,ld,left,right); } void insert(int i,int x,int w) { a[i]=insert(a[i-1],x,w,left,right); } }cmt; int n,m,x,y,k,a[MAXV],b[MAXV]; int rank(int val,int tot) { return lower_bound(b,b+tot,val)-b; } int main() { #ifndef ONLINE_JUDGE freopen("K-th Number.txt","r",stdin); #endif while(scanf("%d %d",&n,&m)!=EOF) { int cnt=0,tot=1; for(int i=0;n>i;i++) { scanf("%d",&a[i]); b[cnt++]=a[i]; } sort(b,b+cnt); for(int i=1;cnt>i;i++) { if(b[i]!=b[i-1]) b[tot++]=b[i]; } cmt.clear(n,0,n-1); for(int i=0;n>i;i++) { cmt.insert(i+1,rank(a[i],tot),+1); } for(int i=0;m>i;i++) { scanf("%d %d %d",&x,&y,&k); printf("%d\n",b[cmt.query(x-1,y,k)]); } } return 0; }