Pagini recente » Cod sursa (job #2870897) | Cod sursa (job #1553087) | Istoria paginii runda/lame.contest/clasament | Cod sursa (job #1687536) | Cod sursa (job #1799318)
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int aib[100010],n,logn;
void aib_update(int i,int s)
{
for(;i<=n;i+=i&(-i)) aib[i]+=s;
}
int aib_query(int i)
{
int s=0;
for(;i>=1;i-=i&(-i)) s+=aib[i];
return s;
}
int caut_bin(int s)
{
int poz=0;
for(int i=logn;i>=0;i--)
if((poz+(1<<i))<=n && aib[poz+(1<<i)]<s)
{
poz+=1<<i;
s-=aib[poz];
}
return poz+1;
}
int main()
{
int m,tip,a,b;
fin>>n>>m;
for(logn=1;(1<<logn)<=n;logn++);
logn--;
for(int i=1;i<=n;i++)
{
fin>>a;
aib_update(i,a);
}
for(int i=1;i<=m;i++)
{
fin>>tip;
if(tip==0)
{
fin>>a>>b;
aib_update(a,b);
}
else if(tip==1)
{
fin>>a>>b;
fout<<aib_query(b)-aib_query(a-1)<<"\n";
}
else
{
fin>>a;
int poz=caut_bin(a);
if(aib_query(poz)==a) fout<<poz<<"\n";
else fout<<"-1\n";
}
}
return 0;
}