Pagini recente » Cod sursa (job #2355785) | Cod sursa (job #1200957) | Cod sursa (job #1314400) | Cod sursa (job #830503) | Cod sursa (job #2142469)
#include <iostream>
#define NMAX 100001
int aib [ NMAX ] ;
int v [ NMAX] ;
using namespace std;
void update (int poz, int val ) {
for (int i = poz ; i < NMAX ; i += i & (-i) )
aib[i] += val ;
}
int query (int poz ) {
int answer = 0 ;
for (int i = poz ; i > 0 ; i -= i & (-i) )
answer += aib[i] ;
return answer ;
}
int main() {
FILE *fin, *fout ;
fin = fopen ("aib.in", "r" ) ;
fout = fopen ("aib.out", "w" ) ;
int n, m, i, a, b, tip, st, dr ;
fscanf (fin, "%d%d", &n, &m ) ;
for (i = 1 ; i <= n ; i++ ) {
fscanf (fin, "%d", &v[i] ) ;
update (i, v[i] ) ;
}
for (i = 1 ; i <= m ; i++ ) {
fscanf (fin, "%d", &tip ) ;
if (tip == 0 ) {
fscanf (fin, "%d%d", &a, &b ) ;
update (a, b ) ;
}
else {
if (tip == 1 ) {
fscanf (fin, "%d%d", &a, &b ) ;
fprintf (fout, "%d\n", query (b) - query(a-1) ) ;
}
else {
fscanf (fin, "%d", &a ) ;
st = 1 ;
dr = n ;
while (st < dr ) {
int pivot = (st + dr ) / 2 ;
if (query (pivot) >= a )
dr = pivot ;
else
st = pivot + 1 ;
}
if (query(st) == a )
fprintf (fout, "%d\n", st ) ;
else
fprintf (fout, "-1\n" ) ;
}
}
}
return 0;
}