제출 #383326

#제출 시각아이디문제언어결과실행 시간메모리
383326peijarHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
0 / 100
928 ms94252 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

struct Requete
{
	int deb, fin, patience, iRequete;

	bool operator<(Requete other) const
	{
		return patience < other.patience;
	}
};

const int NB_FEUILLES = 1 << 20;

int seg[2 * NB_FEUILLES];

void init()
{
	for (int i(0); i < 2 * NB_FEUILLES; ++i) seg[i]= -1;
}

void upd(int iPos, int val)
{
	iPos += NB_FEUILLES;
	seg[iPos] = val;
	while (iPos > 1)
	{
		iPos /= 2;
		seg[iPos] = max(seg[2*iPos], seg[2*iPos+1]);
	}
}

int query(int deb, int fin)
{
	deb += NB_FEUILLES, fin += NB_FEUILLES;
	int sol(-1);
	while (deb < fin)
	{
		if (deb % 2)
			sol = max(sol, seg[deb++]);
		if (fin%2==0)
			sol = max(sol, seg[fin--]);
		deb /= 2; fin /= 2;
	}
	if (deb == fin) sol = max(sol, seg[deb]);
	return sol;
}

signed main(void)
{
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	int nbLivres, nbRequetes;
	cin >> nbLivres >> nbRequetes;
	vector<int> poids(nbLivres);
	for (auto &v : poids) cin >> v;
	vector<Requete> requetes(nbRequetes);
	for (int iRequete = 0; iRequete < nbRequetes; ++iRequete) 
	{
		auto r = requetes[iRequete];
		cin >> r.deb >> r.fin >> r.patience;
		r.deb--, r.fin--;
		r.iRequete = iRequete;
	}
	sort(requetes.begin(), requetes.end());
	vector<int> lft(nbLivres);
	for (int iLivre = 0; iLivre < nbLivres; ++iLivre) 
	{
		lft[iLivre] = iLivre-1;
		while (lft[iLivre] != -1 and poids[lft[iLivre]] <= poids[iLivre])
			lft[iLivre] = lft[lft[iLivre]];
	}
	vector<pair<int, int>> aAjouter;
	for (int iLivre = 0; iLivre < nbLivres; ++iLivre) 
		if (lft[iLivre] != -1)
			aAjouter.emplace_back(poids[iLivre] + poids[lft[iLivre]], iLivre);
	sort(aAjouter.begin(), aAjouter.end());
	init();
	vector<bool> solRequete(nbRequetes);
	for (int iRequete(nbRequetes-1); iRequete >= 0; --iRequete)
	{
		while (!aAjouter.empty() and aAjouter.back().first > requetes[iRequete].patience)
		{
			upd(aAjouter.back().second, lft[aAjouter.back().second]);
			aAjouter.pop_back();
		}
		solRequete[requetes[iRequete].iRequete] = query(requetes[iRequete].deb, requetes[iRequete].fin) < requetes[iRequete].deb;
	}
	for (auto v : solRequete)
		cout << v << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...