이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
const ll MAX_TAILLE=200*1000+5,INFINI=2*1000*1000*1000+5,DECA=(1<<18);
struct antenne{
ll hauteur,minDist,maxDist;
};
struct som{
ll deb,fin,minProp,maxProp,maxi,valMin,valMax;
};
ll taille,nbReq,debReq,finReq;
antenne ant[MAX_TAILLE];
vector<ll> ajout[MAX_TAILLE],suppre[MAX_TAILLE];
vector<pair<ll,ll>> reqFin[MAX_TAILLE];
som maxDiff[2*DECA];
ll rep[MAX_TAILLE];
void prepa(int pos,int debInter,int finInter) {
maxDiff[pos].deb=debInter;
maxDiff[pos].fin=finInter;
maxDiff[pos].minProp=INFINI;
maxDiff[pos].maxProp=-INFINI;
maxDiff[pos].maxi=-1;
maxDiff[pos].valMin=INFINI;
maxDiff[pos].valMax=-INFINI;
if (debInter!=finInter) {
int midInter=(debInter+finInter)/2;
prepa(2*pos,debInter,midInter);
prepa(2*pos+1,midInter+1,finInter);
}
}
void pushFlag(int pos) {
if (maxDiff[pos].minProp!=INFINI and maxDiff[pos].valMax!=-INFINI) {
maxDiff[pos].maxi=max(maxDiff[pos].maxi,abs(maxDiff[pos].minProp-maxDiff[pos].valMax));
}
if (maxDiff[pos].maxProp!=-INFINI and maxDiff[pos].valMin!=INFINI) {
maxDiff[pos].maxi=max(maxDiff[pos].maxi,abs(maxDiff[pos].maxProp-maxDiff[pos].valMin));
}
if (maxDiff[pos].deb!=maxDiff[pos].fin) {
for (int i=0;i<2;i++) {
maxDiff[2*pos+i].minProp=min(maxDiff[2*pos+i].minProp,maxDiff[pos].minProp);
maxDiff[2*pos+i].maxProp=max(maxDiff[2*pos+i].maxProp,maxDiff[pos].maxProp);
}
}
maxDiff[pos].minProp=INFINI;
maxDiff[pos].maxProp=-INFINI;
}
void modifSommet(int pos,int idSom,int typeModif) {
pushFlag(pos);
if (maxDiff[pos].deb>idSom or maxDiff[pos].fin<idSom) {
return;
}
if (maxDiff[pos].deb==maxDiff[pos].fin) {
if (typeModif==0) {
maxDiff[pos].valMin=INFINI;
maxDiff[pos].valMax=-INFINI;
}
else {
maxDiff[pos].valMin=ant[idSom].hauteur;
maxDiff[pos].valMax=ant[idSom].hauteur;
}
}
else {
modifSommet(2*pos,idSom,typeModif);
modifSommet(2*pos+1,idSom,typeModif);
maxDiff[pos].valMin=min(maxDiff[2*pos].valMin,maxDiff[2*pos+1].valMin);
maxDiff[pos].valMax=max(maxDiff[2*pos].valMax,maxDiff[2*pos+1].valMax);
}
}
void nouvProp(int pos,int debInter,int finInter,int valProp) {
if (maxDiff[pos].deb>finInter or maxDiff[pos].fin<debInter) {
pushFlag(pos);
return;
}
if (maxDiff[pos].deb>=debInter and maxDiff[pos].fin<=finInter) {
//cout<<pos<<" "<<debInter<<" "<<finInter<<" "<<valProp<<" : ";
maxDiff[pos].minProp=min(maxDiff[pos].minProp,valProp);
maxDiff[pos].maxProp=max(maxDiff[pos].maxProp,valProp);
//cout<<maxDiff[pos].minProp<<" "<<maxDiff[pos].maxProp<<endl;
pushFlag(pos);
return;
}
pushFlag(pos);
nouvProp(2*pos,debInter,finInter,valProp);
nouvProp(2*pos+1,debInter,finInter,valProp);
maxDiff[pos].maxi=max(maxDiff[pos].maxi,max(maxDiff[2*pos].maxi,maxDiff[2*pos+1].maxi));
}
int calcMax(int pos,int debInter,int finInter) {
pushFlag(pos);
if (maxDiff[pos].deb>finInter or maxDiff[pos].fin<debInter) {
return -1;
}
if (maxDiff[pos].deb>=debInter and maxDiff[pos].fin<=finInter) {
return maxDiff[pos].maxi;
}
return max(calcMax(2*pos,debInter,finInter),calcMax(2*pos+1,debInter,finInter));
}
void afficher() {
cout<<endl;
for (int pos=1;pos<=100;pos++) {
if (maxDiff[pos].deb>0) {
cout<<pos<<" : "<<maxDiff[pos].deb<<" "<<maxDiff[pos].fin<<" "<<maxDiff[pos].valMin<<" "<<maxDiff[pos].valMax<<" "
<<maxDiff[pos].minProp<<" "<<maxDiff[pos].maxProp<<" "<<maxDiff[pos].maxi<<endl;
}
}
cout<<endl;
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>taille;
for (ll i=1;i<=taille;i++) {
cin>>ant[i].hauteur>>ant[i].minDist>>ant[i].maxDist;
}
prepa(1,1,taille);
cin>>nbReq;
for (int i=0;i<nbReq;i++) {
cin>>debReq>>finReq;
reqFin[finReq].push_back({debReq,i});
}
for (ll i=1;i<=taille;i++) {
for (ll j:ajout[i]) {
modifSommet(1,j,1);
}
//afficher();
if (ant[i].minDist<i) {
//cout<<i<<" : "<<max((int)1,i-ant[i].maxDist)<<" "<<i-ant[i].minDist<<" "<<ant[i].hauteur<<endl;
nouvProp(1,max((int)1,i-ant[i].maxDist),i-ant[i].minDist,ant[i].hauteur);
}
//afficher();
if (i+ant[i].minDist<=taille) {
ajout[i+ant[i].minDist].push_back(i);
}
if (i+ant[i].maxDist<=taille) {
suppre[i+ant[i].maxDist].push_back(i);
}
for (auto k:reqFin[i]) {
rep[k.second]=calcMax(1,k.first,i);
}
for (ll j:suppre[i]) {
modifSommet(1,j,0);
}
}
for (int i=0;i<nbReq;i++) {
cout<<rep[i]<<"\n";
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |