Pagini recente » Cod sursa (job #1427037) | Cod sursa (job #1802133) | Cod sursa (job #1867082) | Cod sursa (job #556542) | Cod sursa (job #2755684)
#include <iostream>
#include <fstream>
std::ifstream in("aib.in");
std::ofstream out("aib.out");
const int N=100000;
int AIB[N+2];
void update(int poz, int dif, int n)
{
for(int i=poz+1; i<=n+1; i+=(i&-i))
{
AIB[i]+=dif;
}
}
int sum(int poz)
{
int s=0;
for(int i=poz+1; i>0; i-=(i&-i))
{
s+=AIB[i];
}
return s;
}
int interogare(int suma, int n)
{
int st=1, dr=n, mij, ans=-1;
do
{
mij=(st+dr)/2;
int temp=sum(mij);
if(temp<suma)
{
st=mij+1;
}
else if(temp>suma)
{
dr=mij-1;
}
else if(temp==suma)
{
ans=mij;
break;
}
}
while(st<=dr);
return ans;
}
int main()
{
int n, m, x, l, r, b;
in>>n>>m;
for(int i=1; i<=n; ++i)
{
in>>x;
update(i, x, n);
}
for(int i=1; i<=m; ++i)
{
in>>x;
if(x==0)
{
in>>l>>r;
update(l, r, n);
continue;
}
if(x==1)
{
in>>l>>r;
out<<sum(r)-sum(l-1)<<"\n";
continue;
}
if(x==2)
{
in>>b;
out<<interogare(b, n)<<"\n";
continue;
}
}
return 0;
}