Pagini recente » Cod sursa (job #11400) | Cod sursa (job #2463680) | Cod sursa (job #1634013) | Cod sursa (job #2614015) | Cod sursa (job #2878897)
#include <bits/stdc++.h>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int aib[100010],n,v[100001],logn;
void build()
{
for(int i=1;i<=n;i++)
{
aib[i]+=v[i];
if(i+(i&-i)<=n)
aib[i+(i&-i)]+=aib[i];
}
}
void update(int i,int val)
{
for(int j=i;j<=n;j+=j&-j)
aib[j]+=val;
}
int query(int r)
{
int sum=0;
for(int i=r;i>0;i-=i&(-i))
sum+=aib[i];
return sum;
}
int cautbin(int val) {
int sum=0;
int ans=0;
for(int i=logn;i>=0;i--)
{
if((ans+(1<<i))<=n && sum+aib[ans+(1<<i)]<val)
{
sum+=aib[ans+(1<<i)];
ans+=(1<<i);
}
}
return ans;
}
int main()
{
int q;
in>>n>>q;
for(int i=1;i<=n;i++)
in>>v[i];
logn=floor(log2(n));
build();
for(int i=1;i<=q;i++)
{
int c;
in>>c;
int a,b;
if(c==0)
{
in>>a>>b;
update(a,b);
}
if(c==1)
{
in>>a>>b;
out<<query(b)-query(a-1)<<'\n';
}
if(c==2)
{
in>>a;
int index=cautbin(a)+1;
if(query(index)==a)
out<<index<<'\n';
else
out<<"-1\n";
}
}
return 0;
}