Pagini recente » Profil bflorin97 | Profil rusurares | Poliție | Cod sursa (job #1683987) | Cod sursa (job #2182731)
#include <cstdio>
using namespace std;
#define NMAX 100005
int n, m, aib[NMAX], a[NMAX];
void update(int poz, int val) {
for(; poz<=n; poz += poz&-poz)
aib[poz] += val;
}
int querry(int poz) {
int s = 0;
for(; poz>0; poz-=poz&-poz)
s += aib[poz];
return s;
}
int pozitie(int x) {
int last = -1, med;
int st = 1;
int dr = n;
while(st <= dr) {
med = (st + dr)/2;
if(querry(med) < x)
st = med + 1;
else
if(querry(med) > x)
dr = med - 1;
else {
last = med;
break;
}
}
return last;
}
int main()
{
int i, test, x, y;
FILE *fin, *fout;
fin = fopen("aib.in", "r");
fout = fopen("aib.out", "w");
fscanf(fin, "%d %d", &n, &m);
for(i=1; i<=n; i++) {
fscanf(fin, "%d ", &a[i]);
update(i, a[i]);
}
for(i=1; i<=m; i++) {
fscanf(fin, "%d ", &test);
if(test == 0) {
fscanf(fin, "%d %d", &x, &y);
update(x, y);
}
else
if(test == 1) {
fscanf(fin, "%d %d", &x, &y);
fprintf(fout, "%d\n", querry(y) - querry(x-1));
}
else {
fscanf(fin, "%d", &x);
fprintf(fout, "%d\n", pozitie(x));
}
}
fclose(fin);
fclose(fout);
return 0;
}