Pagini recente » Cod sursa (job #1617938) | Cod sursa (job #2721882) | Cod sursa (job #1368131) | Cod sursa (job #977193) | Cod sursa (job #3217498)
#include <iostream>
#include<fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define NMAX 100001
int n, Q;
int v[2*NMAX];
int tip, a,b;
void update(int poz, int val) {
for (int i = poz; i<=n; i+= (i&-i)) { ///adun ultima putere a lui 2
v[i] += val;
}
}
int query(int st, int dr) {
int ans1 = 0, ans2 = 0;
for (int i = st-1; i>=1; i-= (i&-i)) { ///scad ultima putere a lui 2
ans1 += v[i];
}
for (int i = dr; i>=1; i-= (i&-i)) { ///scad ultima putere a lui 2
ans2 += v[i];
}
return ans2 - ans1;
}
int cautbin(int val) {
int st = 0, dr = n+1, mid, ans = -1;
while (dr-st > 1) {
mid = (st+dr)/2;
int aux = query(0,mid);
if (aux > val) {
dr = mid;
} else if (aux < st) {
st = mid;
} else {
ans = mid;
break;
}
}
return mid;
}
int main()
{
fin >> n >> Q;
for (int i = 1; i<=n; i++) {
fin >> a;
update(i,a);
}
while (Q--) {
fin >> tip;
if (tip == 0) {
fin >> a >> b;
update(a,b);
} else if (tip == 1) {
fin >> a >> b;
fout << query(a,b) << "\n";
} else {
fin >> a;
fout << cautbin(a) << "\n";
}
}
return 0;
}