Pagini recente » Cod sursa (job #1579874) | Cod sursa (job #1517759) | Cod sursa (job #222077) | Cod sursa (job #2901437) | Cod sursa (job #2839093)
#include <iostream>
#include <fstream>
#define zeros(x) ((x ^ (x-1)) & x)
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,k,aib[100001],v[100001],type,a,b;
void adauga (int x,int val)
{
for (int i=x; i<=n; i+=zeros(i))
{
aib[i]+=val;
}
}
int sum1x (int x)
{
int total=0;
for (int i=x; i>0; i-=zeros(i))
{
total+=aib[i];
}
return total;
}
int query (int a)
{
int li=1,ls=n,lm,save=-1,ok=0;
while (li<=ls && ok==0)
{
lm=(li+ls)/2;
//cout<<li<<' '<<ls<<' '<<lm<<' '<<sum1x(lm)<<'\n';
if (sum1x(lm)<a)
{
li=lm+1;
}
else if (sum1x(lm)==a)
{
ok=1;
save=lm;
}
else ls=lm-1;
}
/* lm=(li+ls)/2;
if (sum1x(lm)==a)
save=lm;*/
return save;
}
int main()
{
f>>n>>k;
for (int i=1; i<=n; i++)
{
f>>v[i];
adauga(i,v[i]);
}
for (int i=1; i<=k; i++)
{
f>>type;
if (type==0)
{
f>>a>>b;
adauga(a,b);
}
else if (type==1)
{
f>>a>>b;
g<<sum1x(b)-sum1x(a-1)<<'\n';
}
else
{
f>>a;
g<<query(a)<<'\n';
}
}
return 0;
}