Pagini recente » Cod sursa (job #2390566) | Cod sursa (job #1518795) | Cod sursa (job #2479713) | Cod sursa (job #1269907) | Cod sursa (job #3256392)
#include <fstream>
#define NMAX 100002
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int N,M,x,aib[NMAX];
void update(int nod, int val)
{
for(int i=nod; i<=N; i+=(i&(-i)))
{
aib[i]+=val;
}
}
long long query(int nod)
{
long long s=0;
for(int i=nod; i>=1; i-=(i&(-i)))
{
s+=aib[i];
}
return s;
}
int cautare(long long sum)
{
int poz,p1,p2,pmijl,ok;
long long s;
poz=-1;
p1=1;
p2=N;
while(p1<=p2)
{
s=ok=0;
pmijl=(p1+p2)/2;
for(int i=pmijl; i>=1 && s<=sum; i-=(i&(-i)))
{
s+=aib[i];
if(s==sum)
{
poz=i;
ok=1;
break;
}
}
if(ok)
{
p2=pmijl-1;
}
else
{
p1=pmijl+1;
}
}
return poz;
}
void citire()
{
fin>>N>>M;
for(int i=1; i<=N; i++)
{
fin>>x;
update(i,x);
}
}
int main()
{
int op,a,b;
long long s;
citire();
for(int i=1; i<=M; i++)
{
fin>>op;
if(op==0)
{
fin>>a>>b;
update(a,b);
}
if(op==1)
{
fin>>a>>b;
fout << query(b)-query(a-1) << "\n";
}
if(op==2)
{
fin>>s;
fout<< cautare(s) << "\n";
}
}
return 0;
}