can any one tell me why this code gives wrong answer after 3 testcase on spoj
// k-query
#include<bits/stdc++.h>
using namespace std;
#define NMAX 200010
#define QMAX 100010
vector<pair<int,pair<int,int>>> vc;
vector<pair<int,pair<int,int>>> two;
int tree[NMAX3];
vector<pair<int,int>> pa;
#define GC getchar_unlocked()
int scan()
{
int ret=0,sign=1;
int ip=GC;
for(;ip<‘0’||ip>‘9’;ip=GC)
if(ip==’-’)
{
sign=-1;
ip=GC;
break;
}
for(;ip>=‘0’&&ip<=‘9’;ip=GC)
ret=ret10+ip-‘0’;
return (ret*sign);
}
void BUILD(int node , int start , int end)
{
if(start == end)
{
tree[node]=1;
return ;
}
int mid = (start + end )>>1;
int l = node<<1 ;
int r = node<<1|1;
BUILD(l,start,mid);
BUILD(r,mid+1,end);
tree[ node ]=tree[node*2]+tree[node*2+1];
}
void update(int node,int start,int end,int pos)
{
if(start==end)
tree[node]=0;
else
{
int mid=(start+end)/2;
if(pos>=start && pos<=mid)
update(node2,start,mid,pos);
else
update(node2+1,mid+1,end,pos);
tree[node]=tree[node*2]+tree[node*2+1];
}
}
int Query(int node , int start , int end , int x , int y)
{
if(start == x && end == y)
return tree[node];
int l = node<<1 ;
int r = node<<1|1;
int mid = (start + end )>>1;
// right < mid
if(y <= mid ) return Query(l,start,mid,x,y); // whole side is in left
else if( x > mid ) return Query(r,mid+1,end,x,y) ; // whole side is in right
else
{
return Query(l,start,mid,x,mid)+Query(r,mid+1,end,mid+1,y) ; // split in two side so merging
}
}
bool compare(const pair<int, int>&i, const pair<int, int>&j)
{
return i.first < j.first;
}
// Main logic of the k-query spoj
int main()
{
int n,q,qq;
n=scan();
for(int i=1;i<=n;i++)
{
scanf("%d",&qq);
pa.push_back(make_pair(qq,i));
}
BUILD(1,1,n);
sort(pa.begin(),pa.end());
q=scan();
int val=q;
int l=1;
int ans=0;
while(q--)
{
int i,j,k;
scanf("%d%d%d",&i,&j,&k);
two.push_back(make_pair(k,make_pair(l,ans)));
vc.push_back(make_pair(k,make_pair(i,j)));
l++;
}
sort(vc.begin(),vc.end());
sort(two.begin(),two.end());
int i=1;
for(int j=1;j<=val;j++)
{
//cout<<i<<endl;
while(i<=n && pa[i-1].first<=vc[j-1].first)
{
// cout<<"kad tak "<<pa[i-1].first<<" "<<vc[j-1].first<<endl;
// cout<<"updated pos-> "<<pa[i-1].second<<endl;
update(1,1,n,pa[i-1].second);
i++;
}
int ans=Query(1,1,n,vc[j-1].second.first,vc[j-1].second.second);
two[j-1].second.second=ans;
}
for(int j=0;j<two.size();j++)
{
swap(two[j].first,two[j].second.first);
}
sort(two.begin(),two.end());
for(int i=0;i<two.size();i++)
printf("%d\n",two[i].second.second);
// sort based on index bro
}