Pagini recente » Cod sursa (job #2714218) | Cod sursa (job #2291947) | Cod sursa (job #2693527) | Cod sursa (job #1852464) | Cod sursa (job #2614048)
//#define submit
#ifdef submit
#define fisier "aib"
#else
#define fisier "ULTRA"
#endif
#include <fstream>
std::ifstream in(fisier ".in");
std::ofstream out(fisier ".out");
const int
N = 100000,
M = 150000;
int n, m, v[N];
inline int primul_copil(int idx) {return ((idx+1) << 1) - 1;}
inline int al_doilea_copil(int idx) {return ((idx+1) << 1);}
inline int tata(int idx) {return ((idx+1) >> 1) - 1;}
void modifica_frunza(int idx_frunza, int val)
{
for (int dif = val - v[idx_frunza]; idx_frunza != -1; idx_frunza = tata(idx_frunza))
v[idx_frunza] += dif;
}
int frunza(int idx)
{
int i = 0, j = n - 1, mij, idx_frunza = 0;
//out << "\n\nsrch " << idx << std::endl;
while (i != j)
{
//out << "i = " << i << ", j = " << j << std::endl;
//out << "idx_frunza = " << idx_frunza << std::endl;
mij = (i + j) >> 1;
if (idx <= mij)
{
j = mij;
idx_frunza = primul_copil(idx_frunza);
}
else
{
i = mij + 1;
idx_frunza = al_doilea_copil(idx_frunza);
}
}
//out << "i = " << i << ", j = " << j << std::endl;
//out << "idx_frunza = " << idx_frunza << std::endl;
return idx_frunza;
}
int interog_nod(int idx_nod, int off_i, int lun, int off_j)
{
bool lun_imp = (off_i ^ lun ^ off_j) & 1;
if (!off_i && !off_j)
return v[idx_nod];
if (lun + off_j <= off_i - lun_imp)
return interog_nod(al_doilea_copil(idx_nod), ?, lun, off_j);
if (off_i + lun <= off_j + lun_imp)
return interog_nod(primul_copil(idx_nod), off_j, lun, ?);
return
interog_nod(primul_copil(idx_nod), off_j, ?, 0) +
interog_nod(al_doilea_copil(idx_nod), 0, ?, off_i);
}
inline void modifica(int idx, int val) {modifica_frunza(frunza(idx), val);}
inline int interogare_suma(int i, int j) {return interog_nod(0, i, j - i + 1, n - j - 1);}
int main()
{
in >> n >> m;
for (int i = 0; i < n; i++)
{
frunza(i);
}
}