Pagini recente » Borderou de evaluare (job #178045) | Cod sursa (job #1206572) | Cod sursa (job #2485004) | Cod sursa (job #2455543) | Cod sursa (job #615619)
Cod sursa(job #615619)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
vector <int> vect_aib;
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 n, m;
ifstream fin("aib.in");
fin >> n >> m;
vect_aib.resize(n+1, 0);
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, vect_aib.size()-1);
}
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 < vect_aib.size()) {
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;
}