Pagini recente » Cod sursa (job #3206903) | Cod sursa (job #2606164) | Cod sursa (job #1613785) | Cod sursa (job #241247) | Cod sursa (job #1970514)
#include <bits/stdc++.h>
#define pas(x) ((x-1)^x)&x
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,aib[200005],v,a,b,k;
void update(int x,int val)
{
for(int i=x;i<=n;i+=pas(i))
aib[i]+=val;
}
int suma(int x)
{
int sum=0;
for(int i=x;i>0;i-=pas(i))
sum+=aib[i];
return sum;
}
int cautare_binara()
{
int dr=n,st=1,mijl=0,Sm=0,mini=INT_MAX;
while(st<=dr)
{
mijl=(st+dr)/2;
Sm=suma(mijl);
if(Sm==k && mijl<mini)
mini=mijl;
else
if(Sm>=k)
dr=mijl-1;
else
st=mijl+1;
}
if(mini!=INT_MAX)
return mini;
else
return -1;
}
int main()
{
f>>n>>m;
for(int i=1;i<=n;++i)
f>>a,update(i,a);
for(int i=1;i<=m;i++)
{
f>>v;
if(v==0)
f>>a>>b,update(a,b);
else
if(v==1)
f>>a>>b,g<<suma(b)-suma(a-1)<<'\n';
else
f>>k,g<<cautare_binara()<<'\n';
}
return 0;
}