Question Link : Easy Queries
Please help my solution giving wrong answer i tried many time , but my nearest left and right functions are wrong , please tell me where i m wrong.
PS : Just make nearest left function in same way as i made . @waqar_ahmad224 @ssjgz
#include<bits/stdc++.h>
#include<stdio.h>
using namespace std;
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define MAX 100050
#define INF INT_MAX
/* ------------------------------------------------- Segment tree----------------------------------------------------------- */
int arr[MAX] , st[4*MAX];
/*
si = segemnt index ss = segment start
se = segment end qs = query start
qe = query end
1 based indexing
build_tree(1,1,n);
*/
void build_tree(int si , int ss , int se){
if(ss == se)
{
st[si] = arr[ss];
return;
}
int mid = ss + (se-ss)/2;
build_tree(2*si,ss,mid);
build_tree(2*si+1,mid+1,se);
st[si] = st[2*si]+st[2*si+1];
}
int nearest_left(int si, int ss , int se , int qi){
if(st[si]==0 or qi<ss)
return -INF;
if(ss==se){
return ss;
}
int mid = ss + (se-ss)/2;
if(qi<=mid)
return(max(-INF,nearest_left(2*si,ss,mid,qi)));
else
return(max(-INF, nearest_left(2*si+1,mid+1,se,qi)));
}
int nearest_right(int si, int ss , int se , int qi){
if(st[si]==0 or qi>se)
return INF;
if(ss==se){
return ss;
}
int mid = ss + (se-ss)/2;
int left = nearest_right(2*si,ss,mid,qi);
int right = nearest_right(2*si+1,mid+1,se,qi);
return min(left,right);
}
void update(int si, int ss, int se, int qi ){
if(ss == se)
{
st[si] = arr[ss];
return;
}
int mid = ss + (se-ss)/2;
if(qi<=mid) // means we have to update in left sub tree
update(2*si,ss,mid,qi);
else
update(2*si+1,mid+1,se,qi);
st[si] = st[2*si]+st[2*si+1];
}
/* ------------------------------------------------- Segment tree----------------------------------------------------------- */
int main(){
fastio
int n,l,r,q;
cin>>n>>q;
for(int i=1;i<=n;i++)cin>>arr[i];
build_tree(1,1,n);
while(q--){
int type;
cin>>type;
if(type==0)//print nearest left , right
{
int ind;
cin>>ind;
ind++;
int nearleft = nearest_left(1,1,n,ind);
int nearright = nearest_right(1,1,n,ind);
if(nearleft == -INF)
cout<<"-1 ";
else
cout<<nearleft-1<<" ";
if(nearright == INF)
cout<<"-1\n";
else
cout<<nearright-1<<"\n";
}
else
{
int ind;
cin>>ind;
ind+=1;
if(arr[ind]==0){
arr[ind]=1;
update(1,1,n,ind);
}
}
}
return 0;
}