第一次写线段树题,自己写对,而且一次AC。真高兴,看来心情不好更易做题
///本来看到行是10^9,吓死,还好n只是10^5,所以最多也只需要n行
#include <stdio.h>
#include <iostream>
using namespace std;
int h,w,n;
struct Node
{
int left,right,v;
};
Node node[200005*4];
int max(int a,int b)
{
return a>b?a:b;
}
void build(int i,int l,int r)
{
node[i].left=l;
node[i].right=r;
node[i].v=w;
if(l==r)
return ;
int mid=(l+r)>>1;
build(i<<1,l,mid);
build(i<<1|1,mid+1,r);
}
int query(int i,int x)
{
int t;
if(node[i].v<x)
return -1;
if(node[i].left==node[i].right)
{
node[i].v=node[i].v-x;
return node[i].left;
}
if(node[i<<1].v>=x)
t=query(i<<1,x);
else
t=query(i<<1|1,x);
node[i].v=max(node[i<<1].v,node[i<<1|1].v);
return t;
}
/*void display(int i,int l,int r)
{
cout<<node[i].left<<" "<<node[i].right<<" "<<node[i].v<<endl;
if(l==r)
return ;
int mid=(l+r)>>1;
display(i<<1,l,mid);
display(i<<1|1,mid+1,r);
}*/
int main()
{
int x,i,temp;
while(scanf("%d%d%d",&h,&w,&n)!=EOF)
{
if(h>n){
build(1,1,n);
//display(1,1,n);
//temp=n;
}
else{
build(1,1,h);
// display(1,1,h);
// temp=h;
}
for(i=0;i<n;i++)
{
scanf("%d",&x);
printf("%d\n",query(1,x));
//display(1,1,temp);
}
}
return 0;
}