1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #include<bits/stdc++.h> #define int long long using namespace std; const int N = 1e5 + 20; int n,m; struct node{ int len, type, l, r; }a[N]; int pre[N]; int cal2(int len, int h){ int sum = len*(len+1)/2; int tmp = max(len-h,0LL); int res = tmp*(tmp+1)/2; return sum-res; } int cal(int idx, int col, int h){ if(col > a[idx].r) return 0; if(a[idx].type == 0){ return cal2(a[idx].len, h)-cal2(col - a[idx].l, h); }else{ return cal2(a[idx].r-col+1, h); } } int check(int l, int r, int h){ int idx_l = lower_bound(pre+1,pre+1+n,l)-pre; int idx_r = lower_bound(pre+1,pre+1+n,r)-pre; if(idx_l == idx_r){ return cal(idx_l, l, h)-cal(idx_l, r+1, h); } int ans = cal(idx_l, l, h) + cal(idx_r, a[idx_r].l, h) - cal(idx_r, r+1, h); for(int i = idx_l + 1; i < idx_r; i++){ ans += cal(i, a[i].l, h); } return ans; } signed main() { cin>>n>>m; int max_h = 0; for(int i = 1; i <= n; i++){ cin>>a[i].len>>a[i].type; max_h = max(max_h, a[i].len); pre[i] = pre[i-1] + a[i].len; a[i].l = pre[i-1] + 1; a[i].r = pre[i]; } int L,R,v; for(int i = 1; i <= m; i++){ cin>>L>>R>>v; int l = 1, r = max_h + 1, h = -1; while(l < r){ int mid = l + r >>1; if(check(L, R, mid) >= v){ h = mid; r = mid; }else{ l = mid + 1; } } cout<<h<<endl; } return 0; }
|