Pagini recente » Diferente pentru propuneri/2-concurs-studenti intre reviziile 14 si 27 | Pitici2 | Atasamentele paginii here_we_go_oni_11-12 | Monitorul de evaluare | Cod sursa (job #213979)
Cod sursa(job #213979)
#include <cstdio>
int N, M;
int A[100005];
void update (int i, int val){
for (; i <= N; i += i ^ (i - 1) & i)
A[i] += val;
}
int query (int i){
int sum = 0;
for (; i > 0; i -= i ^ (i - 1) & i)
sum += A[i];
return sum;
}
int search (int sum){
int step, i;
for (step = 1; step <= N; step <<= 1);
for (i = 0; step; step >>= 1)
if (i + step <= N && A[i + step] <= sum)
sum -= A[i + step], i += step;
return sum ? -1 : i;
}
int main (){
freopen ("aib.in", "rt", stdin);
freopen ("aib.out", "wt", stdout);
int val;
scanf ("%d %d\n", &N, &M);
for (int i = 1; i <= N; ++ i)
scanf ("%d ", &val), update (i, val);
int a, b, c;
for (int i = 1; i <= M; ++ i){
scanf ("%d ", &c);
if (!c) scanf ("%d %d\n", &a, &b), update (a, b);
else if (c == 1) scanf ("%d %d\n", &a, &b), printf ("%d\n", query (b) - query (a-1));
else scanf ("%d\n", &a), printf ("%d\n", search (a)) ;
}
return 0;
}