Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- vector <long long> Aint;
- vector <pair <int, int>> Interval;
- void Update (int nod, int st, int dr, long long val, int poz)
- {
- if (st == dr)
- {
- Aint[nod] += val;
- return;
- }
- int mij = st + dr >> 1;
- if (poz <= mij)
- Update(nod << 1, st, mij, val, poz);
- else Update(nod << 1 | 1, mij + 1, dr, val, poz);
- Aint[nod] = max (Aint[nod << 1], Aint[nod << 1 | 1]);
- }
- long long RangeQuerry (int nod, int st, int dr, int a, int b)
- {
- if (a <= st && dr <= b)
- return Aint[nod];
- int mij = st + dr >> 1;
- long long MaxLeft = 0;
- long long MaxRight = 0;
- if (a <= mij)
- MaxLeft = RangeQuerry(nod << 1, st, mij, a, b);
- if (mij < b)
- MaxRight = RangeQuerry(nod << 1 | 1, mij + 1, dr, a, b);
- return max (MaxLeft, MaxRight);
- }
- int main(int argc, char const *argv[])
- {
- ifstream fin ("chimic.in");
- ofstream fout ("chimic.out");
- int n;
- fin >> n;
- Aint.resize(n<<2);
- Interval.resize(n+1);
- fill(Aint.begin(), Aint.end(), 0);
- for (int i = 1; i <= n; ++i)
- {
- int x;
- fin >> x;
- Update (1, 1, n, 1LL*x, i);
- }
- for (int i = 1; i <= n; ++i)
- fin >> Interval[i].first >> Interval[i].second;
- for (int i = n; i >= 1; --i)
- {
- if (Interval[i].first == -1) continue;
- long long maxim = RangeQuerry(1, 1, n, Interval[i].first, Interval[i].second);
- Update(1, 1, n, maxim, i);
- }
- fout << Aint[1];
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement