Pagini recente » Cod sursa (job #2578964) | Cod sursa (job #1420580) | Cod sursa (job #2800830) | Cod sursa (job #831583) | Cod sursa (job #1511429)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
vector <int> aib;
int n, m;
void update(int elm, int val){
int i = elm;
for(; i <= n; i += (i & (-i) ) ) aib[i] += val;
}
int querry(int i){
int sum = 0;
for(; i > 0; i -= (i & (-i) ) ) sum += aib[i];
return sum;
}
int primaSec(int suma){
int dreapta = n, stanga = 1, mij, pot;
while(stanga < dreapta){
mij = (stanga + dreapta) / 2;
pot = querry(mij);
if(pot == suma)
return mij;
else if(pot > suma)
dreapta = mij - 1;
else stanga = mij + 1;
}
if(querry(stanga) == suma)
return stanga;
return -1;
}
int main(){
int x, q, y;
f>>n>>m;
aib.resize(n + 1, 0);
for(int i = 1; i <= n; ++i){
f>>x;
update(i, x);
}
for(int i = 1; i <= m; ++i){
f>>q;
if(q < 2){
f>>x>>y;
if(!q){
update(x, y);
}
else{
g<<querry(y) - querry(x - 1)<<'\n';
}
}
else{
f>>x;
g<<primaSec(x)<<'\n';
}
}
return 0;
}