Pagini recente » Cod sursa (job #1265079) | Cod sursa (job #270364) | Cod sursa (job #1718795) | Profil maestrul | Cod sursa (job #1088852)
#include<stdio.h>
#define nmax 100005
int n, m, poz, rez, x, i, op, a, b, s1, s2, st, dr, mjc, sumtot;
int sum[nmax];
void update()
{
while (poz<=n)
{
sum[poz]+=x;
poz+=poz-(poz&(poz-1));
}
}
void query()
{
rez=0;
while (poz>=1)
{
rez+=sum[poz];
poz-=poz-(poz&(poz-1));
}
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%ld %ld",&n,&m);
for (i=1;i<=n;i++)
{
scanf("%ld",&x);
poz=i; update();
}
for (i=1;i<=m;i++)
{
scanf("%ld",&op);
if (op==0)
{
scanf("%ld %ld",&poz,&x);
update();
}
if (op==1)
{
scanf("%ld %ld",&a,&b);
poz=a-1; query(); s1=rez;
poz=b; query(); s2=rez;
printf("%ld\n",s2-s1);
}
if (op==2)
{
scanf("%ld",&sumtot);
st=1; dr=n;
while (st<=dr)
{
mjc=(st+dr)/2;
poz=mjc; query();
if (rez<=sumtot)
st=mjc+1;
else
dr=mjc-1;
}
poz=dr; query();
if ((rez==sumtot)&&(dr>=1)&&(dr<=n))
printf("%ld\n",dr);
else
printf("-1\n");
}
}
return 0;
}