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 l, t 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.
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.
For each query, print its answer in a single line.
2 1 4
1 5 3
3 3 10
7 10 2
6 4 8
4
-1
8
-1
1 5 2
1 5 10
2 7 4
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; }