Pagini recente » Cod sursa (job #1001207) | Cod sursa (job #22174) | Cod sursa (job #1499366) | Cod sursa (job #2833117) | Cod sursa (job #1384763)
#include<iostream>
#include<fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int N,M,c[100005];
void adauga(int ind,int x);
int suma(int ind);
int poz(int sum);
int main()
{
in>>N>>M;
int i,x,o,a,b;
for(i=1;i<=N;++i)
{
in>>x;
adauga(i,x);
}
while(M--)
{
in>>o;
if(o==0)
{
in>>a>>b;
adauga(a,b);
}
if(o==1)
{
in>>a>>b;
out<<suma(b)-suma(a-1)<<'\n';
}
if(o==2) in>>a,out<<poz(a)<<'\n';
}
}
int poz(int sum)
{
int s=1,d=N,m=0,x;
while(s<=d)
{
m=s+(d-s)/2;
x=suma(m);
if(x==sum) return m;
if(x<sum)
s=m+1;
else
d=m-1;
}
if(x==sum) return m;
return -1;
}
void adauga(int ind,int x)
{
int pow2;
do
{
c[ind]+=x;
pow2=1;
while(!(ind & pow2))
{
pow2=(pow2<<1);
}
ind+=pow2;
}while(ind<=N);
}
int suma(int ind)
{
int pow2,r=0;
do
{
r+=c[ind];
pow2=1;
while(!(ind & pow2))
{
pow2<<=1;
}
ind-=pow2;
}while(ind>0);
return r;
}