Advertisement
FHVirus

Untitled

Jan 29th, 2021
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.54 KB | None | 0 0
  1. //Knapsack DP is harder than FFT.
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. //types
  5. typedef long long ll;
  6. typedef pair<int,int> pii;
  7. //input
  8. bool SR(int &_x){return scanf("%d",&_x)==1;}bool SR(ll &_x){return scanf("%lld",&_x)==1;}
  9. bool SR(double &_x){return scanf("%lf",&_x)==1;}bool SR(char *_x){return scanf("%s",_x)==1;}
  10. bool RI(){return true;}
  11. template<typename I,typename... T>bool RI(I &_x,T&... _tail){return SR(_x) && RI(_tail...);}
  12. //output
  13. void SP(const int _x){printf("%d",_x);}void SP(const ll _x){printf("%lld",_x);}
  14. void SP(const double _x){printf("%.12lf",_x);}void SP(const char *_x){printf("%s",_x);}
  15. void PL(){puts("");}
  16. template<typename I,typename... T>void PL(const I _x,const T... _tail)
  17. {SP(_x);if(sizeof...(_tail))putchar(' ');PL(_tail...);}
  18. //macro
  19. #define SZ(x) ((int)(x).size())
  20. #define AI(x) (x).begin(),(x).end()
  21. #define FOR(i,n) for(int i=0;i<(n);++i)
  22. #define FOO(i,a,b) for(int i=(a);i<=int(b);++i)
  23. #define OOF(i,a,b) for(int i=(a);i>=int(b);--i)
  24. #define pb emplace_back
  25. #define ff first
  26. #define ss second
  27. template<typename I> bool chmax(I &a, I b){ return a < b ? (a = b, true) : false;}
  28. template<typename I> bool chmin(I &a, I b){ return b < a ? (a = b, true) : false;}
  29. //debug
  30. #ifdef OWO
  31. template<typename A,typename B>
  32. ostream& operator<<(ostream& _s, const pair<A,B> &_p){return _s<<'('<<_p.ff<<','<<_p.ss<<')';}
  33. template<typename It>ostream& _OUTC(ostream& _s,It _b,It _e){
  34.     _s<<'{';
  35.     for(auto _it=_b;_it!=_e;++_it) _s<<(_it==_b?"":" ")<<*_it;
  36.     _s<<'}';
  37.     return _s;
  38. }
  39. template<typename A,typename B>
  40. ostream& operator <<(ostream&_s, const map<A,B> &_c){return _OUTC(_s,AI(_c));}
  41. template<typename T>
  42. ostream& operator <<(ostream&_s, const set<T> &_c){return _OUTC(_s,AI(_c));}
  43. template<typename T>
  44. ostream& operator <<(ostream&_s, const vector<T> &_c){return _OUTC(_s,AI(_c));}
  45. template<typename I>
  46. void _DOING(const char *_s,I&& _x){cerr<<_s<<'='<<_x<<endl;}
  47. template<typename I,typename... T>
  48. void _DOING(const char *_s,I&& _x,T&&... _tail){
  49.     int _c=0;
  50.     static const char _bra[]="([{";
  51.     static const char _ket[]=")]}";
  52.     while(*_s!=',' || _c!=0){
  53.         if(strchr(_bra,*_s)) _c++;
  54.         if(strchr(_ket,*_s)) _c--;
  55.         cerr<<*_s++;
  56.     }
  57.     cerr<<'='<<_x<<", ";
  58.     _DOING(_s+1,_tail...);
  59. }
  60. #define debug(...) do{\
  61.     fprintf(stderr,"%s:%d - ",__PRETTY_FUNCTION__,__LINE__);\
  62.     _DOING(#__VA_ARGS__,__VA_ARGS__);\
  63. }while(0)
  64. #else
  65. #define debug(...)
  66. #endif
  67. const int N = 2e5 + 225;
  68. struct segtree{
  69.     int val[N<<2];
  70.     void init(){
  71.         memset(val, -1, sizeof(val));
  72.     }
  73.     void modify(int p, int v, int x, int l, int r){
  74.         if(l == r){
  75.             val[x] = v;
  76.             return;
  77.         }
  78.         int m = (l + r) / 2;
  79.         if(p <= m) modify(p, v, x * 2, l, m);
  80.         else modify(p, v, x * 2 + 1, m+1, r);
  81.         val[x] = min(val[x*2], val[x*2+1]);
  82.     }
  83.     void modify(int p, int v){
  84.         modify(p, v, 1, 0, N);
  85.     }
  86.     int query(int v, int x, int l, int r){
  87.         if(l == r) return l;
  88.         int m = (l + r) / 2;
  89.         if(val[x * 2] >= v) return query(v, x * 2 + 1, m+1, r);
  90.         return query(v, x * 2, l, m);
  91.     }
  92.     int query(int v){
  93.         return query(v, 1, 0, N);
  94.     }
  95. } sgt;
  96.  
  97. int n, m, a[N], id[N], ans[N];
  98. pii q[N];
  99.  
  100. int main(){
  101.     ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  102.     cin >> n >> m;
  103.     FOO(i,1,n) cin >> a[i];
  104.     FOR(i,m) cin >> q[i].ff >> q[i].ss, id[i] = i;
  105.     sort(id, id + m, [](int a, int b){ return q[a].ss < q[b].ss;});
  106.     sgt.init();
  107.     int cur = 0;
  108.     FOR(i,m){
  109.         while(cur < q[id[i]].ss) sgt.modify(a[++cur], cur);
  110.         ans[id[i]] = sgt.query(q[id[i]].ff);
  111.     }
  112.     FOR(i,m) cout << ans[i] << '\n';
  113.     return 0;
  114. }
  115.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement