Pagini recente » Cod sursa (job #1016260) | Cod sursa (job #2627539) | Cod sursa (job #3002694) | Cod sursa (job #2782709) | Cod sursa (job #3288275)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define cin fin
#define cout fout
#define zeros(x) ((x^(x-1))&x)
int n, A[100005];
void Add(int x,int val)
{
for(int i=x;i<=n;i+=zeros(i))
{
A[i]+=val;
}
}
int Compute(int x)
{
long int s=0;
for(int i=x;i>0;i-=zeros(i))
{
s+=A[i];
}
return s;
}
long int s_tot=0,puteri[30],p_max=0;
void init(int n)
{
puteri[0]=1;
int i=0;
while(puteri[i]<=n)
{
puteri[i+1]=puteri[i]*2;
i++;
}
p_max=i-1;
}
int main()
{
int m;
cin>>n>>m;
int x;
init(n);
for(int i=1;i<=n;i++)
{
cin>>x;
s_tot+=x;
Add(i,x);
}
int c,a,b;
for(int i=0;i<m;i++)
{
cin>>c>>a;
if(c==0)
{
cin>>b;
s_tot+=b;
Add(a,b);
}
else if(c==1)
{
cin>>b;
cout<<Compute(b)-Compute(a-1)<<'\n';
}
else
{
int k=0,s_act=0;
for(int i=p_max;i>=0;i--)
{
if(s_act+A[puteri[i]]<=a)
{
s_act+=A[puteri[i]];
k+=puteri[i];
}
}
cout<<k<<'\n';
}
}
return 0;
}