Pagini recente » Istoria paginii utilizator/kaladin | Cod sursa (job #1424129) | Cod sursa (job #585506) | tema | Cod sursa (job #2182806)
#include <fstream>
using namespace std;
int v[100005],aib[100005],sp[100005],n;
#define zeros(x) (x&-x)
void update(int poz,int val)
{
for(;poz<=n;poz=poz+zeros(poz))
aib[poz]+=val;
}
int query(int poz)
{
int s=0;
for(;poz>0;poz=poz-zeros(poz))
s+=aib[poz];
return s;
}
int main()
{
ifstream cin("aib.in");
ofstream cout("aib.out");
int k,l,cer,a,b,x,y,st,dr,mid;
cin >> n >> k;
for(int i=1;i<=n;i++)
{
cin >> v[i];
sp[i]=sp[i-1];
sp[i]+=v[i];
l=i-zeros(i);
aib[i]=sp[i]-sp[l];
}
for(int i=0;i<k;i++)
{
cin >> cer;
if(cer==0)
{
cin >> a >> b;
update(a,b);
}
if(cer==1)
{
cin >> a >> b;
x=query(b);
y=query(a-1);
cout << x-y << endl;
}
if(cer==2)
{
int sol=-1;
cin >> a;
st=1;
dr=n;
while(st<=dr)
{
mid=(st+dr)/2;
if(query(mid)<a)
st=mid+1;
if(query(mid)>a)
dr=mid-1;
if(query(mid)==a)
{
st=mid+1;
sol=mid;
}
}
cout << sol << endl;
}
}
return 0;
}