Я хочу использовать минимальное дерево сегментов, чтобы ответить ни на один из элементов, которые меньше k в указанном диапазоне массива c от l до r в несортированном массиве целых чисел. В запросе рекурсивной функции я возвращаю диапазон данного элемента дерева, если элемент дерева находится в пределах диапазона, а также минимум этого диапазона больше k, т.е. все элементы больше k, и возвращаю 0, если элемент дерева указывает только на один элемент массива, и это тоже меньше, чем к. Пожалуйста, скажите мне, что не так с моим подходом.
Здесь мы не берем ни элементов, ни запросов как входные n и q, затем для следующих n строк мы берем элементы массива как входные. Затем для каждого запроса нам нужно ответить на количество элементов в диапазоне [l, r], которые больше k.
void buildTree(int *a,int s,int e,int *tree,int index){
//Base Case
if(s==e){
tree[index]=a[s];
return;
}
//Recursive case
int mid=(s+e)/2;
buildTree(a,s,mid,tree,2*index);
buildTree(a,mid+1,e,tree,2*index+1);
tree[index]=min(tree[2*index],tree[2*index+1]);
return;
}
int query(int *tree,int ss,int se,int qs,int qe,int k,int index){
//Complete Overlap
if(se==ss&&tree[index]<k)return 0;
if(ss>=qs && se<=qe&& tree[index]>=k)
return se-ss+1;
//No Overlap
if(ss>qe || qs>se)
return 0;
//Partial Overlap
int mid=(ss+se)/2;
int leftAns=query(tree,ss,mid,qs,qe,k,2*index);
int rightAns=query(tree,mid+1,se,qs,qe,k,2*index+1);
return leftAns+rightAns;
}
void updateNode(int *tree,int ss,int se,int i,int update,int index){
//No Overlap
if(i>se||i<ss)
return;
//LeafNode
if(ss==se){
tree[index]=update;
return;
}
//Partial Overlap
int mid=(ss+se)/2;
updateNode(tree,ss,mid,i,update,2*index);
updateNode(tree,mid+1,se,i,update,2*index+1);
tree[index]=min(tree[2*index],tree[2*index+1]);
return;
}
int main(){
int n,q;
cin>>n>>q;
int arr[n];
for(int i=0;i<n;i++)cin>>arr[i];
int tree[4*n];
buildTree(a,0,n-1,tree,1);
for(int i=0;i<q;i++){
int l,r,k;
cin>>l>>r>>k;
cout<<query(tree,0,n-1,l-1,r-1,k,1)<<"\n";
}
return 0;
}