#include <bits/stdc++.h>
bool isPossible(vector<int>& days, vector<int>& candies, vector<int>& k, int n, int m, int currDay)
{
vector<int> candiesLastSaleDay(n + 1, -1);
for(int i = 0; i < m; i++)
{
if (days[i] <= currDay) {
candiesLastSaleDay[candies[i]] = max(candiesLastSaleDay[candies[i]], days[i]);
}
}
vector<vector<int>> lastSaleDay(currDay +1);
for(int i = 0; i < n; ++i)
{
if (candiesLastSaleDay[i+1] != -1)
{
lastSaleDay[candiesLastSaleDay[i+1]].push_back(i);
}
}
vector<int> need = k;
int currMoney = 0;
for(int i = 1; i <= currDay; ++i)
{
currMoney++;
for(int j = 0; j < lastSaleDay[i].size(); j++)
{
if (currMoney >= need[lastSaleDay[i][j]])
{
currMoney -= need[lastSaleDay[i][j]];
need[lastSaleDay[i][j]] = 0;
}
else
{
need[lastSaleDay[i][j]] -= currMoney;
currMoney = 0;
break;
}
}
}
int totalCandies = 0;
for(int i = 0; i < n; i++)
{
totalCandies += need[i];
}
return ((totalCandies * 2) <= currMoney);
}
int minimumDays(vector<int>& days, vector<int>& candies, vector<int>& k, int n, int m)
{
int sumi = accumulate(k.begin(), k.end(), 0); // total number of candies
int high = sumi * 2;
int low = 1;
int ans = 0;
while(low <= high)
{
int mid = (low + high) / 2;
if(isPossible(days, candies, k, n, m, mid)) {
ans = mid;
high = mid - 1;
}
else {
low = mid + 1;
}
}
return ans;
}