//Accepted 14796 KB 453 ms //划分树 //把查询的次数m打成n,也是醉了一晚上!!! //二分l--r区间第k大的数和h比较 #include <cstdio> #include <cstring> #include <iostream> #include <queue> #include <cmath> #include <algorithm> using namespace std; /** * This is a documentation comment block * 如果有一天你坚持不下去了,就想想你为什么走到这儿! * @authr songt */ ; struct node { int val[imax_n]; int num[imax_n]; }f[]; int a[imax_n]; int sorted[imax_n]; int n,m; void build(int t,int l,int r) { if (l==r) return ; ; ; ; for (int i=l;i<=r;i++) if (f[t].val[i]<sorted[mid]) isame--; int ln=l; ; for (int i=l;i<=r;i++) { if (i==l) { f[t].num[i]=; } ]; if (f[t].val[i]<sorted[mid]) { f[t].num[i]++; f[t+].val[ln++]=f[t].val[i]; } else if (f[t].val[i]>sorted[mid]) { f[t+].val[rn++]=f[t].val[i]; } else { if (isame>same) { same++; f[t].num[i]++; f[t+].val[ln++]=f[t].val[i]; } else { f[t+].val[rn++]=f[t].val[i]; } } } build(t+,l,mid); build(t+,mid+,r); } int query(int t,int l,int r,int a,int b,int k) { if (l==r) return f[t].val[l]; ; int s,ss; if (a==l) { ss=; s=f[t].num[b]; } else { ss=f[t].num[a-]; s=f[t].num[b]-ss; } if (s>=k) { a=l+ss; b=l+ss+s-; ,l,mid,a,b,k); } else { int b1=a-l-ss; -s; a=mid++b1; b=mid+b1+b2; ,mid+,r,a,b,k-s); } } int x,y,h; void slove() { build(,,n); ;i<=m;i++) { scanf("%d%d%d",&x,&y,&h); x++; y++; ,r=y-x+; ; ; while (l<=r) { mid=(l+r)/; ,,n,x,y,mid); //printf("pre :l=%d r=%d mid=%d t=%d\n",l,r,mid,t); ; else { ans=mid; l=mid+; } //printf("l=%d r=%d t=%d\n",l,r,t); } printf("%d\n",ans); } } int main() { int T; ; scanf("%d",&T); while (T--) { scanf("%d%d",&n,&m); ;i<=n;i++) { scanf("%d",&a[i]); f[].val[i]=sorted[i]=a[i]; } sort(sorted+,sorted+n+); printf("Case %d:\n",++t); slove(); } ; }