Pagini recente » Monitorul de evaluare | Cod sursa (job #2481176) | Cod sursa (job #1582891) | Cod sursa (job #203552) | Cod sursa (job #1762566)
#include <iostream>
#include <cstdio>
using namespace std;
int n,m,aib[100006],p,x,y;
int zero(int x)
{
return ((x-1)^x)&x;
}
void creare(int i)
{
int o=zero(i);
int j=i;
while(o<=n)
{
aib[j]+=x;
j+=o;
o=zero(j);
}
}
void inserare(int x,int y)
{
int o=zero(x);
int j=x;
while(o<=n)
{
aib[j]+=y;
j+=o;
o=zero(j);
}
}
int suma(int a)
{
int o=((a-1)^a)&a;
if(o>=a||a==1)
return aib[a];
return aib[a]+suma(a-o);
}
int binar(int a)
{
int st=1,dr=n,mij;
while(st<=dr)
{
mij=(st+dr)/2;
int sum=suma(mij);
if(sum==a)
return mij;
if(sum>a)
dr=mij-1;
else
st=mij+1;
}
return -1;
}
int cerinta1(int a,int b)
{
return suma(b)-suma(a-1);
}
void citire()
{
scanf("%d",&n);
scanf("%d",&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
creare(i);
}
for(int i=1;i<=m;i++)
{
scanf("%d",&p);
if(p==2)
{
scanf("%d",&x);
printf("%d\n",binar(x));
}
else
{
scanf("%d%d",&x,&y);
if(p==1)
{
if(x==y)
printf("%d\n",suma(x)-suma(x-1));
else
{
printf("%d\n",cerinta1(x,y));
}
}
else
inserare(x,y);
}
}
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
citire();
//cout << "Hello world!" << endl;
return 0;
}