Pagini recente » Cod sursa (job #1887060) | Cod sursa (job #1536084) | Cod sursa (job #2653189) | Cod sursa (job #1734117) | Cod sursa (job #1324244)
#include <iostream> //poz & (poz - 1) ^ poz = k ---> nr de zerouri in codul binar
#include <fstream>
#define Nmax 100001
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int n, m, v[Nmax];
void aduna(int poz, int val) {
for(poz; poz <= n; poz += poz & (poz - 1) ^ poz) {
v[poz] += val;
}
}
int suma(int poz) {
int i, s = 0;
for(i = poz; i > 0; i -= i & (i - 1) ^ i)
s += v[i];
return s;
}
int cauta(int st, int dr, int val) {
int mid, rez;
while(st <= dr) {
mid = st + (dr - st) / 2;
rez = suma(mid);
if(rez <= val) {
st = mid + 1;
if(rez == val)
return mid;
}
else
dr = mid - 1;
}
return -1;
}
int main()
{
int a, b, i, t, x;
in >> n >> m;
for(i = 1; i <= n; i++) {
in >> x;
aduna(i, x);
}
for(i = 1; i <= m; i++) {
in >> t;
if(t == 2) {
in >> a;
out << cauta(1, n, a) << '\n';
continue;
}
in >> a >> b;
if(t == 1){
out << suma(b) - suma(a - 1) << '\n';
}
else if(t == 0) {
aduna(a, b);
}
}
in.close();
out.close();
return 0;
}