Pagini recente » Cod sursa (job #2213920) | Cod sursa (job #2858936) | Cod sursa (job #233363) | Cod sursa (job #1346071) | Cod sursa (job #1911433)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define zeros(x) ((x^(x-1))&x)
int aib[100001],x,n,v,m,a,b,poz;
void build(int i,int x)
{
for(int j=i;j<=n;j=j+zeros(j))
aib[j]=aib[j]+x;
}
int suma(int s)
{
if(aib[s]==0)
return 0;
else
return aib[s]+suma(s-zeros(s));
}
void divizare(int s,int d,int &m)
{
m=(s+d)/2;
}
void cautare(int s,int d,int val)
{
int m;
if(s<=d)
{
divizare(s,d,m);
if(suma(m)==val)
poz=m;
else
if(val<suma(m))
cautare(s,m-1,val);
else
cautare(m+1,d,val);
}
}
int main()
{
fin>>n>>m;
aib[0]=0;
for(int i=1;i<=n;i++)
{fin>>x;
build(i,x);}
for(int i=1;i<=m;i++)
{
fin>>v;
if(v==0)
{
fin>>a>>b;
build(a,b);
}
else
if(v==1)
{
fin>>a>>b;
fout<<suma(b)-suma(a-1)<<"\n";
}
else
if(v==2)
{
fin>>a;
poz=0;
cautare(1,n,a);
if(poz!=0)
{
if(suma(poz-1)==a)
{
poz=poz-1;
while(suma(poz)==a)
poz=poz-1;
fout<<poz<<"\n";
}
else
fout<<poz<<"\n";}
else
fout<<-1<<"\n";
}
}
return 0;
}