Pagini recente » Cod sursa (job #1363773) | Cod sursa (job #2101782) | Cod sursa (job #514954) | Cod sursa (job #2604228) | Cod sursa (job #1956230)
#include <iostream>
#include <cstdio>
#define NMAX 4*100005
using namespace std;
int n,m,a[NMAX],x;
int update_indice(int nr)
{
return ((nr xor (nr-1))&nr);
}
void update(int nr,int indice)
{
while (indice<=n)
{
a[indice]+=nr;
indice+=update_indice(indice);
}
}
int calc_sum(int poz)
{
int sum=0;
while (poz)
{
sum+=a[poz];
poz-=update_indice(poz);
}
return sum;
}
int caut_bin(int sum)
{
int st=1,dr=n;
while (st<=dr)
{
int mij=(st+dr)/2;
int s=calc_sum(mij);
if (sum<s)
dr=mij-1;
else if (sum>s)
st=mij+1;
else
return mij;
}
return -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1; i<=n; ++i)
{
scanf("%d",&x);
update(x,i);
}
for (int i=1; i<=m; ++i)
{
int op,nr1,nr2;
scanf("%d",&op);
if (op<2)
{
scanf("%d%d",&nr1,&nr2);
if (op==0)
update(nr2,nr1);
else if (op==1)
{
printf("%d\n",calc_sum(nr2)-calc_sum(nr1-1));
}
}
else
{
scanf("%d",&nr1);
printf("%d\n",caut_bin(nr1));
}
}
return 0;
}