Pagini recente » Istoria paginii runda/runda_test/clasament | Cod sursa (job #664751) | Cod sursa (job #460931) | Diferente pentru preoni-2007/runda-3/solutii intre reviziile 46 si 47 | Cod sursa (job #1164940)
#include<stdio.h>
#define nmax 100005
int rez, poz, i, n, st, dr, x, mjc, m, op, a, b, s1, s;
int v[nmax];
void update()
{
while (poz<=n)
{
v[poz]+=x;
poz+=(poz-(poz&(poz-1)));
}
}
int query()
{
rez=0;
while(poz>=1)
{
rez+=v[poz];
poz&=(poz-1);
}
return rez;
}
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;
s1=query();
poz=b;
printf("%ld\n",query()-s1);
}
if (op==2)
{
scanf("%ld",&s);
st=1; dr=n;
while(st<=dr)
{
mjc=(st+dr)/2;
poz=mjc;
if (query()<s)
st=mjc+1;
else
dr=mjc-1;
}
poz=st;
if ((query()==s)&&(st>=1)&&(st<=n))
printf("%ld\n",st);
else
printf("-1\n");
}
}
return 0;
}