Pagini recente » Cod sursa (job #238573) | Cod sursa (job #2803600) | Cod sursa (job #167916) | Cod sursa (job #51431) | Cod sursa (job #3303391)
#include <bits/stdc++.h>
using namespace std;
struct AIB{
vector<long long> aib;
AIB(int n)
{
aib.resize(n+1);
}
int lsb(int nr)
{
int val;
val = (nr & (-nr));
return val;
}
void update(int x, int poz)
{
int i;
for(i = x; i< aib.size(); i+=lsb(i))
{
aib[i]+=poz;
}
}
long long int query(int x)
{
if(x >= aib.size())return -1;
int i;
long long sum = 0;
for(int i = x; i > 0; i-=(lsb(i)))
{
sum+=aib[i];
}
return sum;
}
int cbin(long long s)
{
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]<s)
{
ans+=pas;
sum_ans+=aib[ans];
}
}
return ans+1;
}
};
int main()
{
ifstream cin("aib.in");
ofstream cout("aib.out");
ios_base::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
AIB aib(n+1);
int q;
cin >> q;
int x;
for(int i = 1; i<= n; i++)
{
cin >> x;
aib.update(i, x);
}
for(int i = 1; i<= q; i++)
{
int c; cin >> c;
if(c == 0){
int a, b; cin >> a >> b;
aib.update(a, b);}
else if(c == 1)
{
int a, b;
cin >> a >> b;
cout << aib.query(b) - aib.query(a-1)<<" "<< endl;
}
else if(c == 2)
{
long long s; cin >> s;
int pos = aib.cbin(s);
if(aib.query(pos) == s)cout << pos << endl;
else cout << -1 << endl;
}
}
return 0;
}