Pagini recente » Cod sursa (job #261550) | Cod sursa (job #2848334) | Cod sursa (job #223465) | Cod sursa (job #860896) | Cod sursa (job #615622)
Cod sursa(job #615622)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
int vect_aib[1000000];
void update(int, int);
int query(int);
int sum;
int bSearch(int, int);
inline int val_query(int, int);
inline int max_query(int);
int main(void) {
int m;
ifstream fin("aib.in");
fin >> n >> m;
int val;
for(int i = 1; i <= n; ++i) {
fin >> val;
update(i, val);
}
int op, x, y;
ofstream fout("aib.out");
for(int i = 1; i <= m; ++i) {
fin >> op >> x;
if(op == 0) {
fin >> y;
update(x, y);
}
if(op == 1) {
fin >> y;
fout << val_query(x, y) << '\n';
}
if(op == 2)
fout << max_query(x) << '\n';
}
fin.close();
fout.close();
}
inline int val_query(int x, int y) {
return query(max(x,y)) - query(min(x,y)-1);
}
inline int max_query(int x) {
sum = x;
return bSearch(1, n);
}
int query(int x) {
int sum = 0;
while(x > 0) {
sum += vect_aib[x];
x -= (x & -x);
}
return sum;
}
void update(int x, int y) {
while(x <= n) {
vect_aib[x] += y;
x += (x & -x);
}
}
int bSearch(int x, int y) {
while(x <= y) {
int mij = (x + y) / 2;
int val_mij = query(mij);
if(val_mij == sum)
return mij;
if(sum < val_mij)
y = mij - 1;
else
x = mij + 1;
}
return -1;
}