Pagini recente » Diferente pentru problema/rollercoaster intre reviziile 31 si 30 | Cod sursa (job #1833998) | Cod sursa (job #202165) | Cod sursa (job #461956) | Cod sursa (job #994408)
Cod sursa(job #994408)
#include<stdio.h>
#define NMAX 100007
int Aib[NMAX];
int n, Q;
void update(int poz, int val){
while(poz <= n){
Aib[poz] += val;
poz += poz & (poz ^ (poz - 1));
}
}
int query(int poz){
int sol = 0;
while(poz){
sol += Aib[poz];
poz -= poz & (poz ^ (poz - 1));
}
return sol;
}
int query2(int Sum){
int w = 1;
while(w < n)
w <<= 1;
for(int i = 0; w; w >>= 1)
if(i + w <= n)
if(Sum >= Aib[i + w]){
i += w;
Sum -= Aib[i];
if(! Sum)
return i;
}
return -1;
}
int main(){
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d %d", &n, &Q);
for(int i = 1; i <= n; ++ i){
int a;
scanf("%d", &a);
update(i, a);
}
for(; Q > 0; -- Q){
int Tip = 0, a = 0, b = 0, Sum = 0;
scanf("%d", &Tip);
if(Tip == 0){
scanf("%d %d", &a, &b);
update(a, b);
}
if(Tip == 1){
scanf("%d %d", &a, &b);
printf("%d\n", query(b) - query(a - 1));
}
if(Tip == 2){
scanf("%d", &Sum);
printf("%d\n", query2(Sum));
}
}
return 0;
}