Pagini recente » Cod sursa (job #2903258) | Cod sursa (job #3328216) | Cod sursa (job #3301887) | Cod sursa (job #3338145) | Cod sursa (job #3303580)
#include <bits/stdc++.h>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,Q;
vector<int>v;
int lsb(int x)
{
return x & (-x) ;
}
struct AIB{
vector<long long>aib;
AIB(int n)
{
aib.resize(n+1);
}
void update(int poz,int val)
{
for (int i = poz ; i < aib.size() ; i += lsb(i))
{
aib[i] += val;
}
}
long long query(int x)
{
long long sum=0;
for( int i = x ; i > 0 ; i -= lsb(i) )
sum += aib[i];
return sum;
}
int cbin(long long s, bool strict = false) {
int ans = 0;
long long sum_ans = 0;
for (int pas = (1 << 18); pas > 0; pas /= 2) {
if (ans + pas >= aib.size()) { continue; }
if (sum_ans + aib[ans + pas] + strict <= s) {
ans += pas;
sum_ans += aib[ans];
}
}
return ans;
}
};
int main()
{
f>>n>>Q;
v.resize(n);
AIB aib(n);
for(int i=0;i<n;i++)
{
f>>v[i];
aib.update(i+1,v[i]);
}
for(int q=1;q<=Q;q++)
{
int op=0;
f>>op;
if(op==0)
{
int poz=0;
long long val=0;
f>>poz>>val;
aib.update(poz,val);
}
else if(op==1)
{
int l=0,r=0;
f>>l>>r;
g<< aib.query(r) - aib.query(l-1)<<'\n';
}
else
{
long long a=0;
f>>a;
int ans=aib.cbin(a);
if(aib.query(ans)==a)
g<<ans<<'\n';
else
g<<-1<<'\n';
}
}
return 0;
}