http://codeforces.com/contest/535/problem/C

C. Tavas and Karafs
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

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 issi = 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 lt and m and you should find the largest number r such thatl ≤ 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

The first line of input contains three integers AB 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.

Examples
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

 题意:给一个等差数列,基为a,差为b,每次能对m个值减一,给出范围l,m,和次数t,求最能是得有边为0的最大值;

题解:二分找到符合的位置;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<fstream> 
#include<cmath> 
#include<string> 
#include<vector> 
#include<algorithm>
#include<string> 
#define ll long long
using namespace std;
ll a,b,n,m,l,t;
ll slove(ll x)
{
    ll ans=(a*2+(l+x-2)*b)*(x-l+1)/2;
    return ans;
}
bool judge(ll x)
{
    if(a+(x-1)*b>t)return true;
    if(slove(x)>t*m)return true;
    return false;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>a>>b>>n;
    while(n--)
    {
        cin>>l>>t>>m;
        if(a+(l-1)*b>t)
        {
            cout<<-1<<endl;continue;
        }
        ll L=l,R=1e9;
        while(R-L>=0)
        {
            ll mid=(R+L)>>1;
            if(judge(mid))
            {
                R=mid-1;
            }
            else
            {
                L=mid+1; 
            }
        } 
         cout<<L-1<<endl;
    }
    return 0;
}

 

posted @ 2017-08-15 19:55  lhclqslove  阅读(238)  评论(0)    收藏  举报