Pagini recente » Cod sursa (job #974276) | Cod sursa (job #920939) | Cod sursa (job #1950577) | Cod sursa (job #2380566) | Cod sursa (job #1460023)
#include<bits/stdc++.h>
using namespace std;
int aib[100005];
int n;
int zeros(int i) {
return i & (-i);
}
void update(int x, int val) {
for(int i = x; i <= n; i += zeros(i))
aib[i] += val;
}
int query(int x) {
int sol = 0;
for(int i = x; i > 0; i -= zeros(i))
sol += aib[i];
return sol;
}
int find(int k) {
int step;
for ( step = 1; step < n; step <<= 1 );
for(int i = 0; step; step >>= 1)
if(i + step <= n && aib[i + step] <= k) {
k -= aib[i + step];
i += step;
if(k == 0)
return i;
}
return -1;
}
int main()
{
FILE *fin = fopen("aib.in", "r");
FILE *fout = fopen("aib.out", "w");
int m;
int type, a, b, x;
fscanf(fin, "%d %d", &n, &m);
for(int i = 1; i <= n; ++i) {
fscanf(fin, "%d", &a);
update(i, a);
}
for(int i = 0; i < m; ++i) {
fscanf(fin, "%d", &type);
if(type == 0) {
fscanf(fin, "%d %d", &a, &b);
update(a, b);
}
if(type == 1) {
fscanf(fin, "%d %d", &a, &b);
fprintf(fout, "%d\n", query(b) - query(a - 1));
}
if(type == 2) {
fscanf(fin, "%d", &x);
fprintf(fout, "%d\n", find(x));
}
}
}