Pagini recente » Cod sursa (job #2728030) | Cod sursa (job #1084629) | Cod sursa (job #2833226) | Cod sursa (job #1118354) | Cod sursa (job #1668211)
#include <iostream>
#include <fstream>
using namespace std;
#define zeros(x) ((x^(x-1))&x)
ifstream fin("aib.in");
ofstream fout("aib.out");
int abi[100001],n,m,x,t;
void adauga(int ind,int val){
for(; ind<=n; ind+=zeros(ind))
abi[ind]+=val;
}
int sum(int ind)
{
int s=0;
for(; ind>0; ind-=zeros(ind))
s=s+abi[ind];
return s;
}
int query(int a)
{
int st=1,dr=n,mij=(st+dr)/2;
int valo=sum(mij);
while(valo!=a && st<=dr)
{
if(a<valo)
dr=mij-1;
else
st=mij+1;
mij=(st+dr)/2;
valo=sum(mij);
}
if(st<=dr)
return mij;
else
return -1;
}
int main()
{
fin>>n>>m;
int ind,val,st,dr;
for(int i=1; i<=n; i++)
{
fin>>x;
adauga(i,x);
}
for(;m;m--)
{
fin>>t;
if(t==0)
{
fin>>ind>>val;
adauga(ind,val);
}
else if(t==1)
{
fin>>st>>dr;
fout<<sum(dr)-sum(st-1)<<'\n';
}
else if(t==2)
{
fin>>val;
fout<<query(val)<<'\n';
}
}
return 0;
}