Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cctype>
- #include <algorithm>
- using namespace std;
- struct ELEM
- {
- int x,y;
- };
- int g[300005],val[300005];
- long long BITree[300005];
- int _in_loc;
- char _in_buff[4096];
- ELEM vals[300005];
- int uniqueArr[300005];
- bool cmp(ELEM a,ELEM b)
- {
- return a.x<b.x;
- }
- char read_ch()
- {
- ++_in_loc;
- if (_in_loc == 4096) {
- _in_loc = 0;
- fread(_in_buff, 1, 4096,stdin);
- }
- return _in_buff[_in_loc];
- }
- int read()
- {
- int u32 = 0; char c;
- while (!isdigit(c = read_ch()) );
- u32 = c - '0';
- while (isdigit(c = read_ch())) {
- u32 = u32 * 10 + c - '0';
- }
- return u32;
- }
- inline long long getSum(int index)
- {
- long long sum = 0;
- while (index > 0) {
- if(sum<BITree[index])
- sum=BITree[index];
- index -= index & (-index);
- }
- return sum;
- }
- inline void updateBIT(int newIndex,int index,long long val)
- {
- while (index <= newIndex) {
- if(val>BITree[index])
- BITree[index]=val;
- index += index & (-index);
- }
- }
- inline long long resolve(int n)
- {
- int newindex = 0;
- long long max_sum;
- for (register int i = 0; i < n; i++) {
- vals[i].x=g[i];
- vals[i].y=i;
- }
- sort(vals,vals+n,cmp);
- for(register int i=0;i<n;++i)
- {
- if(vals[i].x==vals[i-1].x)
- uniqueArr[vals[i].y]=uniqueArr[vals[i-1].y];
- else
- uniqueArr[vals[i].y]=++newindex;
- }
- for (register int i = 0; i < n; i++) {
- max_sum = getSum(uniqueArr[i] - 1);
- updateBIT(newindex, uniqueArr[i], max_sum + val[i]);
- }
- return getSum(newindex);
- }
- int main()
- {
- int n;
- scanf("%d",&n);
- _in_loc = 4095;
- for(register int i=0;i<n;++i)
- {
- g[i]=read();
- val[i]=read();
- }
- printf("%lld\n",resolve(n));
- return 0;
- }
Add Comment
Please, Sign In to add comment