Pagini recente » Cod sursa (job #2855244) | Cod sursa (job #2059381) | Cod sursa (job #2705643) | Cod sursa (job #1315329) | Cod sursa (job #530712)
Cod sursa(job #530712)
# include <fstream>
using namespace std;
inline int zero (int a){
return a&-a;
}
int aib[200000], cit, n, m, intrebare, r1, r2;
void adauga (int val, int poz){
for (int i = poz; i <= n; i += zero (i))
aib[i] += val;
}
inline int suma (int poz){
int s = 0;
for (int i = poz; i > 0; i -= zero (i))
s += aib[i];
return s;
}
int cb (int in, int sf, int find){
int ret = -1;
while (in <= sf){
int m = (in + sf) >> 1;
int abc = suma (m);
if (abc >= find){
if (abc == find)
ret = m;
sf = m - 1;
}
else
in = m + 1;
}
return ret;
}
std :: ifstream f ("aib.in");
std :: ofstream g ("aib.out");
int main (){
f >> n >> m;
for (int i = 1; i <= n; ++i){
f >> cit;
adauga (cit, i);
//aib[i] = aib[i - 1] + cit;
}
for (; m > 0; --m){
f >> intrebare;
if (intrebare == 0){
f >> r1 >> r2;
adauga (r2, r1);
continue ;
}
if (intrebare == 1){
f >> r1 >> r2;
g << suma (r2) - suma (r1 - 1) << '\n';
continue ;
}
//aici faci la cautare binara
f >> r1;
g << cb (1, n, r1) << '\n';
}
g.close ();
return 0;
}