Submission #12994

#TimeUsernameProblemLanguageResultExecution timeMemory
12994gs14004역사적 조사 (JOI14_historical)C++98
100 / 100
3948 ms6472 KiB
#include <cstdio> #include <vector> #include <algorithm> using namespace std; const int sz = 300; struct q{int s,e,n;}qr[100005]; bool cmp(q a, q b){return a.s / sz == b.s / sz ? (a.e < b.e) : (a.s < b.s);} int a[100005],n,q; vector<int> p; long long res[100005]; struct seg{ long long tree[270000]; int lim; void init(int n){ for(lim = 1; lim <= n; lim<<= 1); } void add(int pos, int val){ pos += lim; tree[pos] += 1ll * val * p[pos-lim]; while(pos > 1){ pos >>= 1; tree[pos] = max(tree[2*pos],tree[2*pos+1]); } } long long q(){return tree[1];} }seg; void solve(){ seg.init((int)p.size()); int s = 1, e = 0; for (int i=0; i<q; i++) { while (s < qr[i].s) { seg.add(a[s],-1); s++; } while (qr[i].s < s) { s--; seg.add(a[s],1); } while (e < qr[i].e) { e++; seg.add(a[e],1); } while (qr[i].e < e) { seg.add(a[e],-1); e--; } res[qr[i].n] = seg.q(); } } int main(){ scanf("%d %d",&n,&q); for (int i=1; i<=n; i++) { scanf("%d",&a[i]); p.push_back(a[i]); } for (int i=0; i<q; i++) { scanf("%d %d",&qr[i].s,&qr[i].e); qr[i].n = i; } sort(qr,qr+q,cmp); sort(p.begin(),p.end()); p.resize(unique(p.begin(),p.end()) - p.begin()); for (int i=1; i<=n; i++) { a[i] = (int)(lower_bound(p.begin(),p.end(),a[i]) - p.begin()); } solve(); for (int i=0; i<q; i++) { printf("%lld\n",res[i]); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...