Spoj kquery

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=ret
10+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(node
2+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

}