Pagini recente » Cod sursa (job #1736295) | Cod sursa (job #3123652) | Cod sursa (job #1237757) | Cod sursa (job #1994842) | Cod sursa (job #1808620)
#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
{ int a=x&(-x);
aib[x]+=val;
x+=x&(-x);
}
while(x<=N);
}
int suma(int x)
{
int s=0;
while(x!=0)
{
s+=aib[x];
x-=x&(-x);
}
return s;
}
int cauta(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()
{
int val,k,x,y;
f>>N>>M;
for(int i=1;i<=N;i++)
{
f>>val;
adauga(val,i);
}
for(int i=1;i<=M;i++)
{
f>>k;
if(k==0)
{
f>>x>>y;
adauga(y,x);
}
if(k==1)
{
f>>x>>y;
g<<suma(y)-suma(x-1)<<"\n";
}
if(k==2)
{
f>>x;
g<<cauta(x)<<"\n";
}
}
return 0;
}