Pagini recente » Cod sursa (job #2230184) | Cod sursa (job #2836945) | Cod sursa (job #1013566) | Cod sursa (job #1987340) | Cod sursa (job #642765)
Cod sursa(job #642765)
#include <cstdio>
#include <vector>
using namespace std;
int n, nOp, poz;
vector <int> c;
char buff[8192];
void Read(int &nr){
nr = 0;
while (buff[poz] < '0' || buff[poz] > '9')
if (++poz == 8192) {poz = 0; fread(buff, 1, 8192, stdin);}
while (buff[poz] >= '0' && buff[poz] <= '9'){
nr = nr *10 + (buff[poz] - '0');
if (++poz == 8192) {poz = 0; fread(buff, 1, 8192, stdin);}
}
}
void Actualizare(int x, int y){
int ind = x, poz = 0;
while (ind <= n){
c[ind] += y;
while ((ind & (1<<poz)) == 0) poz++;
ind += (1<<poz);
poz++;
}
}
int Suma(int x){
int s = 0, ind = x, poz = 0;
while (ind > 0){
s += c[ind];
while ((ind & (1 << poz)) == 0) poz++;
ind -= (1<<poz);
poz++;
}
return s;
}
int Suma(int x, int y){return Suma(y) - Suma(x-1);}
int Cauta(int st, int dr, int x){
int m = (st + dr) / 2;
if (st > dr) return -1;
if (Suma(m) == x) return m;
if (Suma(m) > x) return Cauta(st, m-1, x);
return Cauta(m+1, dr, x);
}
int main()
{
freopen ("aib.in", "r", stdin), freopen("aib.out", "w", stdout);
Read(n), Read(nOp);
int i, x, y, op;
c.assign(n+1, 0);
for (i = 1; i <= n; i++){
Read(x);
Actualizare (i, x);
}
for (i = 0; i < nOp; i++){
Read(op);
switch (op){
case 0 :
Read(x), Read(y);
Actualizare(x, y);
break;
case 1:
Read(x), Read(y);
printf ("%d\n", Suma(x, y));
break;
case 2:
Read(x);
int ind = 1;
while (x > c[ind] && ind < n) ind <<= 1;
printf ("%d\n", Cauta(ind >> 1, ind, x));
}
}
return 0;
}