小卡因爲公務須要出差,將新家中的狗狗們託付給朋友嘉嘉,可是嘉嘉是一個很懶的人,他纔沒那麼多時間幫小卡喂狗狗。ui
小卡家有N只狗,因爲品種、年齡不一樣,每一隻狗都有一個不一樣的漂亮值。漂亮值與漂亮的程度成反比(漂亮值越低越漂亮),吃飯時,狗狗們會按順序站成一排等着主人給食物。spa
但是嘉嘉真的很懶,他纔不願喂這麼多狗呢,這多浪費時間啊,因而他每次就只給第i只到第j只狗中第k漂亮的狗狗餵食(好狠心的人啊)。並且爲了保證某一隻狗狗不會被喂太屢次,他喂的每一個區間(i,j)不互相包含。code
第一行輸入兩個數n,m,你能夠假設n<300001 而且 m<50001;m表示他餵了m次。blog
第二行n個整數,表示第i只狗的漂亮值爲ai。it
接下來m行,每行3個整數i,j,k表示此次餵食喂第i到第j只狗中第k漂亮的狗的漂亮值。io
輸出格式:M行,每行一個整數,表示每一次喂的那隻狗漂亮值爲多少。class
這個題出題人的意圖是卡主席樹的空間,卡平衡樹的常數,,,而後我平衡樹掛的比較慘,主席樹卡過了;sort
正解就是離線跑權值線段樹;di
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=3e5+10; 5 int n,k,sz,ts; 6 int a,b,c; 7 int s[maxn],hs[maxn],tt[maxn]; 8 struct tree{int s,mid,lp,rp;}t[maxn*25]; 9 void build(int l,int r,int k){ 10 t[k].mid=l+r>>1; 11 if(l==r) return; 12 t[k].lp=++ts,t[k].rp=++ts; 13 build(l,t[k].mid,t[k].lp); 14 build(t[k].mid+1,r,t[k].rp); 15 } 16 void put(int l,int r,int k,int nk,int p){ 17 t[nk]=(tree){t[k].s+1,t[k].mid}; 18 if(l==r) return; 19 if(p<=t[nk].mid){ 20 t[nk].lp=++ts,t[nk].rp=t[k].rp; 21 put(l,t[nk].mid,t[k].lp,t[nk].lp,p); 22 } 23 else{ 24 t[nk].rp=++ts,t[nk].lp=t[k].lp; 25 put(t[nk].mid+1,r,t[k].rp,t[nk].rp,p); 26 } 27 } 28 int search(int k,int nk,int v){ 29 if((t[k].lp==0)&&(t[k].rp==0)) return t[k].mid; 30 int w=t[t[nk].lp].s-t[t[k].lp].s; 31 if(v<=w) return search(t[k].lp,t[nk].lp,v); 32 else return search(t[k].rp,t[nk].rp,v-w); 33 } 34 int main(){ 35 scanf("%d%d",&n,&k); 36 for(int i=1;i<=n;i++){ 37 scanf("%d",&s[i]); 38 hs[i]=s[i]; 39 } 40 sort(hs+1,hs+n+1); 41 sz=unique(hs+1,hs+n+1)-hs-1; 42 build(1,sz,tt[0]); 43 for(int i=1;i<=n;i++){ 44 int pos=lower_bound(hs+1,hs+sz+1,s[i])-hs; 45 tt[i]=++ts; 46 put(1,sz,tt[i-1],tt[i],pos); 47 } 48 for(int i=1;i<=k;i++){ 49 scanf("%d%d%d",&a,&b,&c); 50 printf("%d\n",hs[search(tt[a-1],tt[b],c)]); 51 } 52 return 0; 53 }