Pagini recente » Cod sursa (job #2963945) | Cod sursa (job #994406) | Cod sursa (job #1539731) | Istoria paginii utilizator/mariodinu | Cod sursa (job #2912771)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
const int NMAX=1e5+5;
int aib[NMAX];
int v[NMAX];
int bcmm;
int n;
int lsb(int x)
{
return x^(x&(x-1));
}
void update(int val,int p)
{
while(p<=n)
{
aib[p]=aib[p]+val;
p=p+lsb(p);
}
}
long long cerinta1(int p)
{
long long s=0;
while(p>0)
{
s=s+aib[p];
p=p-lsb(p);
}
return s;
}
int cerinta2(int val)
{
int s=0,p=0,i;
for(i=bcmm;i>0;i=i/2)
{
if(p+i<=n)
{
if(s+aib[p+i]<val)
{
s+=aib[p+i];
p=p+i;
}
}
}
if(s+v[p+1]!=val)
return -1;
return p+1;
}
int main()
{
int i,j,m,x,y,cer,a,b;
fin>>n>>m;
bcmm=1;
for(i=1;i<=n;i++)
{
fin>>v[i];
update(v[i],i);
}
while(bcmm*2<=n)
{
bcmm=bcmm*2;
}
for(i=1;i<=m;i++)
{
fin>>cer;
if(cer==0)
{
fin>>a>>b;
update(b,a);
}
if(cer==1)
{
fin>>a>>b;
fout<<cerinta1(b)-cerinta1(a-1)<<"\n";
}
if(cer==2)
{
fin>>a;
fout<<cerinta2(a)<<"\n";
}
}
return 0;
}