Pagini recente » Cod sursa (job #1414923) | Cod sursa (job #344963) | Cod sursa (job #2161472) | Monitorul de evaluare | Cod sursa (job #2392091)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fi("aib.in");
ofstream fo("aib.out");
int n,m;
int a[100001],aib[100001];
void update(int i, int x)
{
if(i<=n)
{
aib[i]+=x;
int y=i&(-i);
update(i+y,x);
}
}
long long query(int i)
{
if(i>=1)
{
long long ans=0;
ans+=aib[i];
int y=i&(-i);
ans+=query(i-y);
return ans;
}
return 0;
}
int Search(int val)
{
int i, step;
for ( step = 1; step < n; step <<= 1 );
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()
{
fi>>n>>m;
for(int i=1; i<=n; i++)
fi>>a[i];
for(int i=1; i<=n; i++)
update(i,a[i]);
for(int i=1; i<=m; i++)
{
int x;
int p1,p2;
fi>>x;
if(x==2)
{
fi>>p1;
fo<<Search(p1)<<'\n';
}
else
{
fi>>p1>>p2;
if(x==0)
update(p1,p2);
else
fo<<query(p2)-query(p1-1)<<'\n';
}
}
return 0;
}