Pagini recente » Cod sursa (job #2938622) | Cod sursa (job #2410599) | Cod sursa (job #2394058) | Cod sursa (job #937411) | Cod sursa (job #432559)
Cod sursa(job #432559)
#include <algorithm>
using namespace std;
#define DIM 100005
int aib[DIM];
int n,m;
inline int lsb (int x)
{
return x&(-x);
}
inline void update (int poz,int val)
{
for ( ; poz<=n; poz+=lsb (poz))
aib[poz]+=val;
}
void read ()
{
int i,x;
scanf ("%d%d",&n,&m);
for (i=1; i<=n; ++i)
{
scanf ("%d",&x);
update (i,x);
}
}
inline int query (int poz)
{
int sum;
for (sum=0; poz; poz-=lsb (poz))
sum+=aib[poz];
return sum;
}
inline int cbin (int val)
{
int st,dr,mij,sol;
sol=0;
for (st=1, dr=n; st<=dr; )
{
mij=(st+dr)/2;
if (query (mij)>=val)
{
sol=mij;
dr=mij-1;
}
else
st=mij+1;
}
if (query (sol)==val)
return sol;
return -1;
}
void solve ()
{
int i,tip,x,y;
for (i=1; i<=m; ++i)
{
scanf ("%d",&tip);
if (!tip)
{
scanf ("%d%d",&x,&y);
update (x,y);
}
else if (tip==1)
{
scanf ("%d%d",&x,&y);
printf ("%d\n",query (y)-query (x-1));
}
else
{
scanf ("%d",&x);
printf ("%d\n",cbin (x));
}
}
}
int main ()
{
freopen ("aib.in","r",stdin);
freopen ("aib.out","w",stdout);
read ();
solve ();
return 0;
}