Pagini recente » Cod sursa (job #2636475) | Cod sursa (job #2606434) | Cod sursa (job #1462423) | Cod sursa (job #2265373) | Cod sursa (job #1074973)
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int N = 100000, M = 150000;
int aib[N], n, step = 1<<16;
int query0 (int p){
int s = 0;
while(p != 0){
s += aib[p];
p -= p & (-p);
}
return s;
}
int query2(int k, int val){
while(step != 0){
if(k+step <= n && aib[k+step] <= val){
val -= aib[k+step];
k += step;
}
step /= 2;
}
if(k == 0){
return -1;
}
if(val == 0){
return k;
}
return -1;
}
void update(int p, int val){
while(p <= n){
aib[p] += val;
p += p&(-p);
}
}
int main()
{
int m, i, a, b, type;
in >> n >> m;
for(i = 1; i <= n; i++){
in >> a;
update(i, a);
}
for(i = 1; i <= m; i++){
in >> type;
if(type == 0){
in >> a >> b;
update (a, b);
} else {
if(type == 1){
in >> a >> b;
out << query0(b) - query0(a-1) << "\n";
} else {
in >> a;
step = 1<<16;
out << query2(0,a) << "\n";
}
}
}
return 0;
}