Pagini recente » Cod sursa (job #2946757) | Cod sursa (job #1672656) | Cod sursa (job #1303588) | Cod sursa (job #1499648) | Cod sursa (job #780730)
Cod sursa(job #780730)
#include <iostream>
#include <stdio.h>
using namespace std;
#define nmax 100010
int a[nmax];
int N,M;
void update(int poz, int val)
{
int K=0;
while (poz <= N)
{
a[poz]=a[poz]+val;
while ( !(poz & (1<<K)) ) K++;
poz=poz+(1<<K);
K++;
}
}
int query(int poz)
{
int S,K;
S=0; K=0;
while ( poz > 0 )
{
S=S+a[poz];
while ( !( poz&(1<<K)) ) K++;
poz=poz-(1<<K);
K++;
}
return S;
}
int serch(int val)
{
int s,k,poz,ok;
ok=1; poz=0; s=0;
while (ok)
{
k=-1; ok=0;
while (s+a[poz+(1<<(k+1))]<=val && poz+(1<<(k+1))<=N ) {
k++; ok=1; }
if (k!=-1) { s=s+a[poz+(1<<k)]; poz=poz+(1<<k); }
}
if (s-val==0 && val!=0 ) return poz; else return -1;
}
int main()
{
int i,a,b,x,p=0;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%i%i",&N,&M);
for (i=1; i<=N; ++i) { scanf("%i",&a); update(i,a); }
for (i=1; i<=M; ++i)
{
scanf("%i",&x);
if (x==0)
{
scanf("%i%i",&a,&b);
update(a,b);
} else
if (x==1)
{
scanf("%i%i",&a,&b);
printf("%i\n",query(b)-query(a-1));
} else
{
scanf("%i",&a);
printf("%i\n",serch(a));
p++;
}
}
return 0;
}