Pagini recente » Cod sursa (job #1351040) | Cod sursa (job #20117) | Cod sursa (job #3222889) | Cod sursa (job #3223206) | Cod sursa (job #3224192)
#pragma GCC target("sse4.2")
#include <fstream>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
const int Nmax=100005;
int aib[Nmax];
int lsb(int x)
{
return(x^(x-1))&x;
}
void update(int a,int b,int n)
{
for(int i=a;i<=n;i+=lsb(i))
{
aib[i]+=b;
}
}
int query(int a)
{
int sol=0;
for(int i=a;i>0;i-=lsb(i))
{
sol=sol+aib[i];
}
return sol;
}
int bs(int a,int n)
{
int k=__builtin_clz(n);
int d=(1<<(31-k));
int p=0;
for(int i=d;i>0;i=i>>1)
{
if(p+i<=n && aib[p+i]<=a)
{
a=a-aib[p+i];
p=p+i;
}
}
if(a==0 && p!=0)
{
return p;
}
else return -1;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
update(i,x,n);
}
int a,b,c;
for(int i=1;i<=m;i++)
{
cin>>c;
if(c==0)
{
cin>>a>>b;
update(a,b,n);
}
if(c==1)
{
cin>>a>>b;
cout<<query(b)-query(a-1)<<'\n';
}
if(c==2)
{
cin>>a;
cout<<bs(a,n)<<'\n';
}
}
return 0;
}