# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
901633 | Gabriel | 원숭이와 사과 나무 (IZhO12_apple) | C++17 | 51 ms | 262144 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "bits/stdc++.h"
using namespace std;
struct Nodo{
long long Suma, Uneado;
};
vector<Nodo> _rbol;
long long Consulta(long long Izquierda, long long Derecha, long long Posici_n, long long Inicio, long long Final){
if(Izquierda >= Inicio and Derecha <= Final) return _rbol[Posici_n].Suma;
else if(Izquierda > Final or Derecha < Inicio) return 0;
else {
long long Promedio = (Izquierda + Derecha) / 2;
if(_rbol[Posici_n].Uneado == 1 and Izquierda != Derecha){
_rbol[Posici_n * 2].Suma = Promedio - Izquierda + 1;
_rbol[Posici_n * 2 + 1].Suma = Derecha - (Promedio + 1) + 1;
_rbol[Posici_n * 2].Uneado = 1;
_rbol[Posici_n * 2 + 1].Uneado = 1;
_rbol[Posici_n].Uneado = 0;
}
return Consulta(Izquierda, Promedio, Posici_n * 2, Inicio, Final) + Consulta(Promedio + 1, Derecha, Posici_n * 2 + 1, Inicio, Final);
}
}
void Actualizar(long long Izquierda, long long Derecha, long long Posici_n, long long Inicio, long long Final){
if(Izquierda >= Inicio and Derecha <= Final){
_rbol[Posici_n].Uneado = 1;
_rbol[Posici_n].Suma = Derecha - Izquierda + 1;
} else if(Izquierda > Final or Derecha < Inicio) return;
else {
long long Promedio = (Izquierda + Derecha) / 2;
if(_rbol[Posici_n].Uneado == 1 and Izquierda != Derecha){
_rbol[Posici_n * 2].Suma = Promedio - Izquierda + 1;
_rbol[Posici_n * 2 + 1].Suma = Derecha - (Promedio + 1) + 1;
_rbol[Posici_n * 2].Uneado = 1;
_rbol[Posici_n * 2 + 1].Uneado = 1;
_rbol[Posici_n].Uneado = 0;
}
Actualizar(Izquierda, Promedio, Posici_n * 2, Inicio, Final);
Actualizar(Promedio + 1, Derecha, Posici_n * 2 + 1, Inicio, Final);
_rbol[Posici_n].Suma = _rbol[Posici_n * 2].Suma + _rbol[Posici_n * 2 + 1].Suma;
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
long long n, m;
cin>>m;
n = 10e6 + 5;
Nodo E;
E.Suma = 0;
E.Uneado = 0;
_rbol.assign(n * 4, E);
n--;
long long C = 0;
while(m--){
long long Tipo;
cin>>Tipo;
if(Tipo == 1){
long long l, r;
cin>>l>>r;
l--;
r--;
long long Consultado = Consulta(0, n, 1, l + C, r + C);
C += Consultado;
cout<<Consultado<<"\n";
} else {
long long l, r;
cin>>l>>r;
l--;
r--;
Actualizar(0, n, 1, l + C, r + C);
}
/*for(auto i: _rbol) cout<<i.Suma<<" ";
cout<<"\n";
for(auto i: _rbol) cout<<i.Uneado<<" ";
cout<<"\n";*/
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |