Pagini recente » Cod sursa (job #77795) | Cod sursa (job #2052678) | Cod sursa (job #933576) | Cod sursa (job #381967) | Cod sursa (job #2700387)
#include <iostream>
#include <fstream>
const int MAXN = 100000 + 1;
using namespace std;
typedef long long ll;
ifstream in("aib.in");
ofstream out("aib.out");
int n,q;
ll aib[MAXN];
int mub(int x){
return ((x ^ (x - 1)) & x);
}
ll suma(int x){
/// suma pe intervalul (0,x]
ll s = 0;
while(x){
s += aib[x];
x -= mub(x);
}
return s;
}
void update(int pos,int val){
while(pos <= n){
aib[pos] += 1ll * val;
pos += mub(pos);
}
}
int cautbinar(int suma){
int index = 0;
int pas = 1<<16;
ll suma_curenta = 0;
while(pas){
if(index + pas <= n && suma_curenta + aib[index + pas] <= 1ll * suma){
index += pas;
suma_curenta += aib[index];
// cout<<suma_curenta<<endl;
// cout<<"OK "<<pas<<" "<<aib[index + pas]<<endl;
}
pas /= 2;
}
if(suma_curenta == suma)
return index;
return -1;
}
int main()
{
in>>n>>q;
for(int i = 1; i <= n; i++){
int val;
in>>val;
update(i,val);
}
for(int i = 1; i <= q; i++){
int tip;
in>>tip;
if(tip == 0){
int pos,val;
in>>pos>>val;
update(pos,val);
}else if(tip == 1){
int a,b;
in>>a>>b;
out<<suma(b) - suma(a - 1)<<'\n';
}else if(tip == 2){
int suma;
in>>suma;
out<<cautbinar(suma)<<'\n';
}
}
return 0;
}