Pagini recente » Cod sursa (job #375394) | Cod sursa (job #1850910) | Cod sursa (job #669105) | Cod sursa (job #2031315) | Cod sursa (job #545245)
Cod sursa(job #545245)
#include<fstream>
#define dmax 100001
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int n,m,aib[dmax];
short int x[dmax];
void update(int a,int b)
{
int poz;
poz=a;
aib[a]+=b;
while(poz < n)
{
poz+= (poz & (-poz) );
aib[poz]+=b;
}
}
int suma(int a)
{
int poz,s=0;
s+=aib[a];
poz=a;
while(poz > 0)
{
poz-=( poz & (-poz) );
s+=aib[poz];
}
return s;
}
void build_aib()
{
int i;
for(i=1;i<=n;i++)
update(i,x[i]);
}
int bins(int a)
{
int l,r,m,s;
l=1, r=n;
while(l <= r)
{
m=(l+r)/2;
s=suma(m);
if(s == a )
return m;
else if( s < a)
l=m+1;
else r=m-1;
}
return -1;
}
int main()
{ int i,op,a,b;
in>>n>>m;
for(i=1;i<=n;i++)
in>>x[i];
build_aib();
for(i=1;i<=m;i++)
{ in>>op;
if(op==0)
{ in>>a>>b;
update(a,b);
}
else if(op==1)
{ in>>a>>b;
out<<suma(b)-suma(a-1)<<'\n';
}
else
{ in>>a;
out<<bins(a)<<'\n';
}
}
in.close();
out.close();
return 0;
}