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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| #include #include #include #include #include #include #include #include #include #include #include #include
using namespace std; #define mem(a, b) memset(a, b, sizeof(a)) #define PI acos(-1) #define debug(a) cout << (a) << endl typedef long long ll; int dir8[8][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 1 }, { 1, -1 }, { -1, 1 }, { -1, -1 } }; int dir4[4][2] = { 1, 0, 0, 1, -1, 0, 0, -1 }; const int INF = 0x3f3f3f3fLL; const long long LLF = 0x3f3f3f3f3f3f3f3fLL; const int MAXn = 2e5 + 15; const int mod = 1e9 + 7;
int n, m, c[MAXn], ans[MAXn],cnt; struct node { int ty, pos, x, y, k; } q[MAXn], q1[MAXn], q2[MAXn];
int lowbit(int x) { return x & -x; } void add(int x, int val) { while (x <= n) { c[x] += val; x += lowbit(x); } } int sum(int x) { int sum = 0; while (x>0) { sum += c[x]; x -= lowbit(x); } return sum; } void solve(int l, int r, int L, int R) { if (l > r L > R) return; if (L == R) { for (int i = l; i <= r; i++) { if (q[i].ty) { ans[q[i].pos] = L; } } return; } int mid = (L + R) >> 1, cnt1 = 0, cnt2 = 0; for (int i = l; i <= r; i++) { if (q[i].ty) { int temp = sum(q[i].y) - sum(q[i].x - 1); if (temp >= q[i].k) q1[++cnt1] = q[i]; else { q[i].k -= temp; q2[++cnt2] = q[i]; } } else { if(q[i].x<=mid){ add(q[i].pos,q[i].y); q1[++cnt1]=q[i]; } else q2[++cnt2]=q[i]; } } for(int i=1;i<=cnt1;i++){ if(!q1[i].ty){ add(q1[i].pos,-q1[i].y); } } for(int i=1;i<=cnt1;i++){ q[l+i-1]=q1[i]; } for(int i=1;i<=cnt2;i++){ q[l+i+cnt1-1]=q2[i]; } solve(l,l+cnt1-1,L,mid); solve(l+cnt1,r,mid+1,R); return ; } int main(){
cin>>n>>m; int l,r,k; for(int i=1;i<=n;i++){ cin>>k; q[++cnt]=node{0,i,k,1,0}; } for(int i=1;i<=m;i++){ cin>>l>>r>>k; q[++cnt]=node{1,i,l,r,k}; } solve(1,cnt,-INF,INF); for(int i=1;i<=m;i++) cout<<ans[i]<<endl; return 0; }
|