Pagini recente » Cod sursa (job #739852) | Cod sursa (job #808627) | Cod sursa (job #1522472) | Cod sursa (job #1894393) | Cod sursa (job #2844967)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
int x,n,m,op,a,b,k,r;
int aib[100001];
void update(int pos,int val);
int query(int pos);
int cautare(int sum);
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
{
fin>>a;
update(i,a);
}
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>>a;
k=cautare(a);
if(query(k)==a)
fout<<k<<'\n';
else
fout<<-1<<'\n';
}
}
fin.close();
fout.close();
return 0;
}
void update(int pos,int val)
{
while(pos<=n)
{
aib[pos]+=val;
pos+=(pos&(-pos));
}
return;
}
int query(int pos)
{
int rez=0;
while(pos!=0)
{
rez+=aib[pos];
pos-=pos&(-pos);
}
return rez;
}
int cautare(int sum)
{
int p=1;
while(p*2<=n)
p*=2;
int pos=1;
while(p)
{
if(query(pos+p-1)<sum&&pos+p-1<=n)
pos+=p;
p/=2;
}
return pos;
}