您的位置:首页 > 其它

Q-Tavas and Karafs

2017-05-09 21:22 369 查看
Description

Karafs is some kind of vegetable in shape of an 1 × h rectangle. Tavaspolis people love Karafs and they use Karafs in almost any kind of food. Tavas, himself, is crazy about Karafs.

Each Karafs has a positive integer height. Tavas has an infinite 1-based sequence of Karafses. The height of the i-th Karafs is si = A + (i - 1) × B.

For a given m, let’s define an m-bite operation as decreasing the height of at most m distinct not eaten Karafses by 1. Karafs is considered as eaten when its height becomes zero.

Now SaDDas asks you n queries. In each query he gives you numbers l, t and m and you should find the largest number r such that l ≤ r and sequence sl, sl + 1, …, sr can be eaten by performing m-bite no more than t times or print -1 if there is no such number r.

Input
4000

The first line of input contains three integers A, B and n (1 ≤ A, B ≤ 106, 1 ≤ n ≤ 105).

Next n lines contain information about queries. i-th line contains integers l, t, m (1 ≤ l, t, m ≤ 106) for i-th query.

Output

For each query, print its answer in a single line.

Sample Input

Input

2 1 4

1 5 3

3 3 10

7 10 2

6 4 8

Output

4

-1

8

-1

Input

1 5 2

1 5 10

2 7 4

Output

1

2

这个题一看就是codeforces的,巨难懂,看了n遍……

就是给你一个等差数列,后要求如果每次可以最多选择m个数

使这m个数-1 那么在t次操作中可以使l为左端点的最长序列中使所有数为0 输出这个最长序列的右端序号

#include<stdio.h>
long long  a,b,n;//给的空间大应该要用long
long long l,t,m;
long long an(long long x)
{
return a+(x-1)*b;
}

long long get_sum(long long r)
{
return (an(r)+an(l))*(r-l+1)/2;
}

int main()
{
long long i,j,k;
while(~scanf("%I64d%I64d%I64d",&a,&b,&n))
{
while(n--)
{
scanf("%I64d%I64d%I64d",&l,&t,&m);
if(an(l)>t)
{
printf("-1\n");
continue;
}
long long lle= l;
long long lri=(t-a)/b+1;
long long mid;
while(lle<=lri)
{
long long mid = (lle+lri)/2;
if(get_sum(mid)<=t*m)
lle = mid+1;
else
lri = mid-1;
}
printf("%d\n",lle-1);
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: