Pagini recente » Cod sursa (job #2198450) | Cod sursa (job #3202507) | Cod sursa (job #723433) | Cod sursa (job #1123430) | Cod sursa (job #1668206)
#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(int i=ind; i<=n; i+=zeros(i))
abi[i]+=val;
}
int sum(int ind)
{
int s=0;
for(int i=ind; i>0; i-=zeros(i))
s=s+abi[i];
return s;
}
int query(int a)
{
int st=1,dr=n;
int 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 i,ind,val,st,dr;
for(i=1; i<=n; i++)
{
fin>>x;
adauga(i,x);
}
for(i=1; i<=m; i++)
{
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;
}