Thinking: There are 2 tips for this problem.
(1) If we use struct , TLE may appear. Instead, I changed to use array maxl[] to store the largest space left in a row in this interval.
(2) Since n <= 200000, we needn't declare an 10^9 array. If the h is larger than n , we make h = n.
AC code:
#include<iostream>
#define maxn 200222
#define MAX(a,b) ((a)>(b)?(a):(b))
using namespace std;
int maxl[maxn * 4];
int h, w, n;
void build(int rt, int left, int right)
{
maxl[rt] = w;
if (left == right)
{
return;
}
int mid = (left + right) >> 1;
build(rt << 1, left, mid);
build(rt << 1|1, mid+1, right);
}
void push_up(int rt)
{
maxl[rt] = MAX(maxl[rt << 1], maxl[rt << 1 | 1]);
}
inline int query(int rt, int left,int right,int val)
{
if (left == right)
{
maxl[rt] -= val;
return left;
}
int mid = (left + right) >> 1;
if (maxl[rt<<1] >= val)
{
int ans = query(rt << 1,left,mid,val);
push_up(rt);
return ans;
}
else
{
int ans = query(rt << 1|1,mid+1,right, val);
push_up(rt);
return ans;
}
}
int main()
{
while (scanf("%d%d%d", &h, &w, &n) != EOF)
{
if (h > n)
h = n;
build(1, 1, h);
int temp;
for (int i = 1; i <= n; i++)
{
scanf("%d", &temp);
if (maxl[1] < temp)
printf("-1\n");
else printf("%d\n", query(1,1,h,temp));
}
}
return 0;
}