Pagini recente » Cod sursa (job #1474599) | Cod sursa (job #2268309) | Cod sursa (job #2194458) | Cod sursa (job #2194601) | Cod sursa (job #3166911)
#include <array>
#include <iostream>
#include <chrono>
#include <fstream>
constexpr int nmax = 100000;
int aib[nmax + 5];
int n;
int ub(int x){
return (x & (-x));
}
void add(int x, int y)
{
for(int i = x; i <= n; i += ub(i)) {
aib[i] += y;
}
}
int sum(int x){
int rez = 0;
for(int i = x; i >= 1; i -= ub(i)){
rez += aib[i];
}
return rez;
}
int main() {
auto start = std::chrono::high_resolution_clock::now();
std::ifstream in("grader_test6.in");
std::ofstream out("grader_test6.out");
int m;
in >> n >> m;
for(int i = 1; i <= n; i++){
int x;
in >> x;
add(i, x);
}
for(int i = 0; i < m; i++) {
int op, a, b;
in >> op >> a;
if(op == 0){
in >> b;
add(a, b);
}else if(op == 1){
in >> b;
out << sum(b) - sum(a-1) << "\n";
}else {
int st = 0, dr = n;
int mij = st + (dr - st)/ 2;
int minval = n + 1;
while(st <= dr){
if(sum(mij) == a){
if(mij < minval) minval = mij;
else break;
}
if(sum(mij) <= a){
st = mij + 1;
}else {
dr = mij - 1;
}
mij = st + (dr-st)/2;
}
if(minval == n+1) minval = -1;
out << minval << "\n";
}
}
auto stop = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(stop - start);
std::cout << duration.count() / 1000.0f << " milliseconds" << std::endl;
}