Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- */
- #pragma comment(linker, "/STACK:16777216")
- #define _CRT_SECURE_NO_WARNINGS
- #include <fstream>
- #include <iostream>
- #include <string>
- #include <complex>
- #include <math.h>
- #include <set>
- #include <vector>
- #include <map>
- #include <queue>
- #include <stdio.h>
- #include <stack>
- #include <algorithm>
- #include <list>
- #include <ctime>
- #include <memory.h>
- #include <assert.h>
- #define y0 sdkfaslhagaklsldk
- #define y1 aasdfasdfasdf
- #define yn askfhwqriuperikldjk
- #define j1 assdgsdgasghsf
- #define tm sdfjahlfasfh
- #define lr asgasgash
- #define norm asdfasdgasdgsd
- #define eps 1e-9
- #define M_PI 3.141592653589793
- #define bs 1000000007
- #define bsize 350
- using namespace std;
- const int INF = 1e9;
- const int N = 200000;
- int n, m;
- int ar[N];
- vector<int> t[N*4];
- vector<long long> sum[N * 4];
- void build(int v, int tl, int tr)
- {
- if (tl == tr)
- {
- t[v].push_back(ar[tl]);
- }
- else
- {
- int tm = tl + tr;
- tm /= 2;
- build(v * 2, tl, tm);
- build(v * 2 + 1, tm + 1, tr);
- int ptr1 = 0;
- int ptr2 = 0;
- while (ptr1 < t[v * 2].size() || ptr2 < t[v * 2 + 1].size())
- {
- if (ptr1 == t[v * 2].size())
- {
- t[v].push_back(t[v * 2 + 1][ptr2]);
- ++ptr2;
- continue;
- }
- if (ptr2 == t[v * 2 + 1].size())
- {
- t[v].push_back(t[v * 2][ptr1]);
- ++ptr1;
- continue;
- }
- if (t[v * 2][ptr1] < t[v * 2 + 1][ptr2])
- {
- t[v].push_back(t[v * 2][ptr1]);
- ++ptr1;
- continue;
- }
- t[v].push_back(t[v * 2 + 1][ptr2]);
- ++ptr2;
- continue;
- }
- }
- long long S = 0;
- for (int i = 0; i < t[v].size(); i++)
- {
- S += t[v][i];
- sum[v].push_back(S);
- }
- }
- long long make_query(int v, long long val)
- {
- if (val >= t[v].back())
- return sum[v][t[v].size()-1];
- if (val<t[v][0])
- return 0;
- int cur = val;
- int ps = upper_bound(t[v].begin(), t[v].end(), cur) - t[v].begin();
- //cout << ps << " %" << sum[v][ps - 1] << endl;
- return sum[v][ps-1];
- }
- long long get(int v, int tl, int tr, int l, int r, long long bound)
- {
- if (l>r)
- return 0;
- if (l == tl&&r == tr)
- {
- return make_query(v, bound);
- }
- int tm = tl + tr;
- tm /= 2;
- return get(v * 2, tl, tm, l, min(r, tm), bound) + get(v * 2 + 1, tm + 1, tr, max(tm + 1, l), r, bound);
- }
- int main(){
- //freopen("fabro.in","r",stdin);
- //freopen("fabro.out","w",stdout);
- //freopen("F:/in.txt", "r", stdin);
- //freopen("F:/output.txt", "w", stdout);
- ios_base::sync_with_stdio(0);
- //cin.tie(0);
- cin >> n >> m;
- for (int i = 1; i <= n; i++)
- {
- cin >> ar[i];
- }
- build(1, 1, n);
- for (; m; --m)
- {
- int l, r;
- long long can_make;
- cin >> l >> r;
- can_make = 0;
- while (true)
- {
- long long new_val = get(1, 1, n, l, r, can_make + 1);
- //cout << new_val << endl;
- //cin.get();
- if (new_val == can_make)
- break;
- can_make = new_val;
- }
- cout << can_make + 1 << endl;
- }
- cin.get(); cin.get();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement