Skip to content

Commit 7196226

Browse files
authored
Merge pull request #22 from raunak96/master
Added Binary Indexed Tree
2 parents 05b1717 + 18c200d commit 7196226

File tree

2 files changed

+103
-0
lines changed

2 files changed

+103
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#include<bits/stdc++.h>
2+
using namespace std;
3+
#define N 500000
4+
pair<long long int,int> a[N+1],c[N+1];
5+
long long int b;
6+
int bit[N+1];
7+
void update(int ind,int n)
8+
{
9+
while(ind<=n)
10+
{
11+
bit[ind]++;
12+
ind+=ind&(-ind);
13+
}
14+
}
15+
long long int que(int ind)
16+
{
17+
long long int ans=0;
18+
while(ind>0)
19+
{
20+
ans+=bit[ind];
21+
ind-=ind&(-ind);
22+
}
23+
return ans;
24+
}
25+
int main()
26+
{
27+
ios_base::sync_with_stdio(false);
28+
cin.tie(0);
29+
int n,q;
30+
long long int cnt,l,r;
31+
cin>>n>>q;
32+
for(int i=1;i<=n;i++)
33+
cin>>b,a[i].first+=a[i-1].first+b,a[i].second=i,c[i]=a[i];
34+
sort(c+1,c+n+1);
35+
for(int i=1;i<=n;i++)
36+
a[c[i].second].second=i;
37+
while(q--)
38+
{
39+
cnt=0;
40+
cin>>l>>r;
41+
for(int i=1;i<=n;i++)
42+
{
43+
int h=upper_bound(c+1,c+n+1,make_pair(a[i].first-l,INT_MAX))-c;
44+
int lo=lower_bound(c+1,c+n+1,make_pair(a[i].first-r,INT_MIN))-c;
45+
if(a[i].first>=l && a[i].first<=r)
46+
cnt+=1;
47+
cnt+=que(h-1)-que(lo-1);
48+
update(a[i].second,n);
49+
}
50+
cout<<cnt<<endl;
51+
for(int i=1;i<=n;i++)
52+
bit[i]=0;
53+
}
54+
return 0;
55+
}

data_structure/invcnt_BIT.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include<bits/stdc++.h>
2+
using namespace std;
3+
#define siz 200000
4+
long long int bit[siz+1];
5+
pair<int,int> a[siz+1];
6+
long long int que(int x)
7+
{
8+
long long int ans=0;
9+
while(x>0)
10+
{
11+
ans+=bit[x];
12+
x-=(x&-x);
13+
}
14+
return ans;
15+
}
16+
void update(int ind,int n)
17+
{
18+
while(ind<=n)
19+
{
20+
bit[ind]++;
21+
ind+=(ind&-ind);
22+
}
23+
}
24+
int main()
25+
{
26+
int t,n,r,maxi;
27+
long long int cnt;
28+
scanf("%d",&t);
29+
while(t--)
30+
{
31+
cnt=0;
32+
scanf("%d",&n);
33+
for(int i=1;i<=n;i++)
34+
{
35+
scanf("%d",&a[i].first);
36+
a[i].second=i;
37+
}
38+
sort(a+1,a+n+1);
39+
for(int i=1;i<=n;i++)
40+
{
41+
cnt+=que(n)-que(a[i].second);
42+
update(a[i].second,n);
43+
}
44+
printf("%lld\n",cnt);
45+
for(int i=1;i<=n;i++)
46+
bit[i]=0;
47+
}
48+
}

0 commit comments

Comments
 (0)