Cod sursa(job #3246868)
Utilizator | Data | 4 octombrie 2024 17:18:48 | |
---|---|---|---|
Problema | Arbori indexati binar | Scor | 0 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.14 kb |
#include <bits/stdc++.h>
using namespace std;
int aib[100005];
int n, q, x, t, a, b;
void upd(int i, int val)
{
while(i<=n)
{
aib[i]+=val;
i+=(i&-i);
}
}
int query(int i)
{
int ans=0;
while(i>=1)
{
ans+=aib[i];
i-=(i&-i);
}
return ans;
}
int main()
{
ifstream cin("aib.in");
ofstream cout("aib.out");
cin>>n>>q;
for(int i=1; i<=n; i++)
{
cin>>x;
upd(i, x);
}
for(int i=1; i<=q; i++)
{
cin>>t;
if(t==0)
{
cin>>a>>b;
upd(a, b);
}
else if(t==1)
{
cin>>a>>b;
cout<<query(b)-query(a-1)<<'\n';
}
else
{
cin>>x;
int st=1, dr=n, md, ans;
while(st<=dr)
{
md=(st+dr)/2;
if(x>=query(md))
{
ans=md;
st=md+1;
}
else dr=md-1;
}
cout<<ans<<'\n';
}
}
return 0;
}