Pagini recente » Profil ion232323 | Cod sursa (job #797645) | Cod sursa (job #517844) | Istoria paginii runda/bkt1_oct2011 | Cod sursa (job #2703091)
#include <bits/stdc++.h>
#define lsb(x) (x&(-x))
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int nmax=100005;
int aib[nmax],s[nmax],v[nmax],i,j,tip,n,m;
void adauga(int x,int val)
{
for(int poz=x;poz<=n;poz+=poz&(-poz))
aib[poz]+=val;
}
int suma(int x)
{
int s=0;
for(int poz=x;poz;poz-=poz&(-poz))
s+=aib[poz];
return s;
}
int cautbin_min(int val)
{
int st=1,dr=n,ans=-1;
while(st<=dr)
{
int mij=(st+dr)/2;
int temp=suma(mij);
if(temp<=val)
{
if(temp==val)
ans=mij;
st=mij+1;
}
else
dr=mij-1;
}
return ans;
}
int main()
{
fin>>n>>m;
for(i=1;i<=n;i++)
fin>>v[i];
for(i=1;i<=n;i++)
s[i]=s[i-1]+v[i];
for(i=1;i<=n;i++)
{
int temp=i-lsb(i);
aib[i]=s[i]-s[temp];
}
while(m--)
{
fin>>tip;
if(tip==0)
{
int x,val;
fin>>x>>val;
adauga(x,val);
}
else if(tip==1)
{
int st,dr;
fin>>st>>dr;
fout<<suma(dr)-suma(st-1)<<'\n';
}
else
{
int val;
fin>>val;
fout<<cautbin_min(val)<<'\n';
}
}
return 0;
}