Mai intai trebuie sa te autentifici.
Cod sursa(job #2900740)
Utilizator | Data | 12 mai 2022 04:53:37 | |
---|---|---|---|
Problema | Datorii | Scor | 0 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 3.25 kb |
#include <fstream>
std::ifstream f("datorii.in");
std::ofstream g("datorii.out");
int v[400040], res;
void update(int nod, int st, int dr, int pos, int val, bool modify = false)
{
if (st == dr)
{
if (modify)
v[nod] -= val; // s-a mai platit din rata
else
v[nod] = val;
}
else
{
int mij = (st + dr) / 2;
if (mij >= pos)
update(nod >> 1, st, mij, pos, val, modify);
else
update(nod >> 1 + 1, mij + 1, dr, pos, val, modify);
v[nod] = v[nod >> 1] + v[nod >> 1 + 1];
}
}
void call(int nod, int st, int dr, int a, int b) {
if (a <= st && dr <= b) {
res += v[nod];
return;
}
int mij = (st + dr) / 2;
if (mij >= a)
call(nod * 2, st, mij, a, b);
if (mij + 1 <= b)
call(nod * 2 + 1, mij + 1, dr, a, b);
}
int main(void)
{
int n, m, x, c, a, b;
f >> n >> m;
for (int i = 1; i <= n; ++i) {
f >> x;
//int nod, int st, int dr, int pos, int val
update(1, 1, n, i, x);
}
for (int i = 1; i <= m; ++i)
{
f >> c >> a >> b;
if (c == 1) {
res = 0;
call(1, 1, n, a, b);
g << res << '\n';
}
else
update(1, 1, n, a, b, 1);
}
}
//
//
//
//#include <iostream>
//#include <fstream>
//#include <vector>
//#include <string>
//#define INT_MAX 2147483647;
//std::ifstream f("datorii.in");
//std::ofstream g("datorii.out");
//const int N_MAX = 15005;
//int a[N_MAX], v[4*N_MAX], res;
//int n, m, x, c, A, B;
//void build(int st, int dr, int nod){
// if (st == dr) {
// v[nod] = a[st];
// }
// else {
// int mij = (st + dr) / 2;
// build(st, mij, 2 * nod);
// build(mij + 1, dr, 2 * nod + 1);
// v[nod] = v[2 * nod] + v[2 * nod + 1];
// }
//}
//void update(int nod, int st, int dr, int pos, int val)
//{
// if (st == dr)
// {
// v[nod] -= val; // s-a mai platit din rata
// return;
// }
// else
// {
// int mij = (st + dr) / 2;
// if (mij >= pos)
// update(nod * 2, st, mij, pos, val);
// else
// update(nod * 2 + 1, mij + 1, dr, pos, val);
// v[nod] = v[nod * 2] + v[nod * 2 + 1];
// }
//}
//void call(int nod, int st, int dr, int a, int b) {
// if (a <= st && dr <= b) {
// res += v[nod];
// return;
// }
// int mij = (st + dr) / 2;
// if (mij >= a)
// call(nod * 2, st, mij, a, b);
// if (mij + 1 <= b)
// call(nod * 2 + 1, mij + 1, dr, a, b);
//}
//int main(void)
//{
//
// f >> n >> m;
// for (int i = 1; i <= n; ++i) {
// f >> a[i];
// //int nod, int st, int dr, int pos, int val
// /*update(1, 1, n, i, x);*/
// }
// build(1, n, 1);
// for (int i = 1; i <= m; ++i)
// {
// f >> c >> A >> B;
// if (c == 1) {
// res = 0;
// call(1, 1, n, A, B);
// g << res << '\n';
// }
// else
// {
// update(1, 1, n, A, B);
// }
// }
//}