Pagini recente » Cod sursa (job #2831216) | Cod sursa (job #2567725) | Cod sursa (job #2105981) | Cod sursa (job #607175) | Cod sursa (job #1703907)
#include <bits/stdc++.h>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int aib[100005],N,M;
void adauga(int val,int x)
{
do
{
aib[x]+=val;
x+=x&(-x);
}
while(x<=N);
}
int suma(int x)
{
int s=0;
while(x!=0)
{
s+=aib[x];
// x &= x-1;
x-=x&(-x);
}
return s;
}
void afis(int a[])
{
for(int i=1;i<=N;i++)
{
cout<<a[i]<<" ";
}
cout<<"\n";
}
int cauta(int val)
{
int i, step;
for ( step = 1; step < N; step <<= 1 );
// cout<<"\n***"<<step<<"\n**\n";
for( i = 0; step; step >>= 1 )
{
if( i + step <= N)
{
if( val >= aib[i+step] )
{
i += step, val -= aib[i];
if ( !val ) return i;
}
}
}
return -1;
}
int main()
{
int val,k,x,y;
f>>N>>M;
for(int i=1;i<=N;i++)
{
f>>val;
adauga(val,i);
}
// afis(aib);
for(int i=1;i<=M;i++)
{
f>>k;
if(k==0)
{
f>>x>>y;
adauga(y,x); ///y-poz, x- val;
}
if(k==1)
{
f>>x>>y;
g<<suma(y)-suma(x-1)<<"\n";
}
if(k==2)
{
f>>x;
g<<cauta(x)<<"\n";
}
}
return 0;
}