Pagini recente » Cod sursa (job #2438359) | Cod sursa (job #890927) | Cod sursa (job #1066772) | Cod sursa (job #2438379) | Cod sursa (job #3152813)
#include <fstream>
#define int long long
using namespace std;
long long n, v[100005];
void update(int i, int val)
{
while(i<=n)
{
v[i]+=val;
i+=(i&-i);
}
}
int presum(int i)
{
int sum=0;
while(i>0)
{
sum+=v[i];
i-=(i&-i);
}
return sum;
}
int dif(int a, int b)
{
return presum(b)-presum(a-1);
}
int32_t main()
{
ifstream cin("aib.in");
ofstream cout("aib.out");
long long a, c, b, k;
cin >> n >> k;
//cout << "n = " << n << ", k = " << k << "\n";
for(int i=1; i<=n; i++)
{
cin >> a;
update(i, a);
}
/*
cout << v[8] << "\n";
for(int j=1; j<=n; j++)
{
cout << presum(j) << " ";
}
cout << "\n\n";*/
for(int i=1; i<=k; i++)
{
cin >> c >> a;
if(c==0 || c==1) cin >> b;
if(c==0) update(a, b);
else if(c==1) cout << dif(a, b) << "\n";
else if(c==2)
{
long long st=0, dr=n+1, mid;
while(st<dr)
{
mid=(st+dr)/2;
if(presum(mid)<a) st=mid+1;
else dr=mid;
}
if(presum(dr)==a) cout << dr << "\n";
else cout << "-1\n";
}
}
return 0;
}