Pagini recente » Cod sursa (job #1894362) | Cod sursa (job #827953) | Cod sursa (job #2808073) | Cod sursa (job #2970065) | Cod sursa (job #2868399)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("aib.in");
ofstream fout("aib.out");
int n,aib[100002],v[100002],pw=1,logn,put[100];
void update (int poz, int val)
{
for (int i=poz;i<=n;i += (i&-i))
aib[i] += val;
}
int query (int poz)
{
int sum=0;
for (int i=poz;i>=1;i -= (i&-i))
sum += aib[i];
return sum;
}
int q3 (int val)
{
int sum=0,pos=0;
for (int i=logn;i>=0;i--)
{
if (pos+put[i] <=n && sum+aib[pos+put[i]] < val)
{
sum+=aib[pos+put[i]];
pos+=put[i];
}
}
if (pos==n || sum+v[pos+1] != val)
return -1;
return pos+1;
}
int main()
{
int q,i,x,t,a,b;
fin>>n>>q;
for (i=1;i<=n;i++)
{
fin>>x;
v[i]=x;
update (i,x);
}
while (pw<=n)
{
put[logn]=pw;
pw*=2;
logn++;
}
logn--;
pw/=2;
for (;q>0;q--)
{
fin>>t>>a;
if (t==2)
fout<<q3(a)<<'\n';
else{
fin>>b;
if (t==0)
update(a,b),v[a]+=b;
else
fout<<query(b)-query(a-1)<<'\n';
}
}
return 0;
}