Pagini recente » Cod sursa (job #2482166) | Cod sursa (job #2951147) | Cod sursa (job #1932444) | Cod sursa (job #378619) | Cod sursa (job #2251691)
#include <fstream>
using namespace std;
int n,i,m,A,p,s,d,k,j,a,b,x,s1,s2,v[100005],aib[100005];
void add (int a, int b)
{
while(a<=n)
{
aib[a]+=b;
a=a+(a-(a&(a-1)));
}
}
void suma (int a)
{
while(a)
{
s1+=aib[a];
a&=a-1;
}
}
int main()
{
ifstream f("aib.in");
ofstream g("aib.out");
f>>n>>m;
for(i=1;i<=n;i++)
f>>v[i];
///Formam aib: aib[i]=suma ultimilor X nr , unde X=2^max din descompunerea lui i.
for(i=1;i<=n;i++)
{
k=i&(i-1);
for(j=i;j>k;j--)
aib[i]+=v[j];
}
for(i=1;i<=m;i++)
{
f>>x;
if(x==0)
{
f>>a>>b;
add(a,b);
}
if(x==1)
{
f>>a>>b;
a--; s1=0;
suma(a);
s2=s1; s1=0;
suma(b);
g<<s1-s2<<'\n';
}
if(x==2)
{
f>>A;
s=1; d=n;
while(s<=d)
{
p=(s+d)/2;
s1=0;
suma(p);
if(s1<A)
s=p+1;
else
d=p-1;
}
if(s1==A)
g<<p<<'\n';
else
{
p++;
s1=0;
suma(p);
if(s1==A)
g<<p<<'\n';
else
g<<-1<<'\n';
}
}
}
return 0;
}