Submission #377846

#TimeUsernameProblemLanguageResultExecution timeMemory
377846astoria역사적 조사 (JOI14_historical)C++14
40 / 100
4026 ms130028 KiB
#include "bits/stdc++.h"
using namespace std;

const int N=1e5+5,Q=1e5+5;
const int S = 600;
struct Query{
	int l,r,p,bk;
};
Query qr[Q];
int n,q,x[N];

struct node{
	int s,e,m; long long val;
	node *l, *r;
	node(int _s, int _e){
		s=_s; e=_e;
		m=(s+e)>>1;
		val = 0;
	}
	
	void create(){
		if(s!=e){
			l=new node(s,m);
			r=new node(m+1,e);
		}
	}
	
	void upd(int p, int v){
		if(s==e) val += (long long) v;
		else{
			if(l==NULL) create();
			if(p<=m) l->upd(p,v);
			else r->upd(p,v);
			
			val = max(l->val,r->val);
		}
	}
	
	long long qry(){
		return val;
	}
	
} *root;

bool comp(Query A, Query B){
	if(A.bk != B.bk) return A.bk < B.bk;
	return A.bk % 2 ? A.r > B.r : A.r < B.r;
}

int32_t main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	cin>>n>>q;
	for(int i=1; i<=n; i++) cin>>x[i];
	for(int i=0; i<q; i++){
		cin>>qr[i].l>>qr[i].r;
		qr[i].p = i;
		qr[i].bk = qr[i].l / S;
	}
	sort(qr,qr+q,comp);
	
	root = new node(0,(int) 1e9+5);
	
	int mo_left = 1, mo_right = 0;
	
	long long ans[q];
	
	for(int i=0; i<q; i++){
		int left = qr[i].l, right = qr[i].r;
		while(mo_right < right){
			++mo_right;
			int t = x[mo_right];
			root->upd(t,t);
		}
		while(mo_left > left){
			--mo_left;
			int t = x[mo_left];
			root->upd(t,t);
		}
		while(mo_right > right){
			int t = x[mo_right];
			root->upd(t,-t);
			--mo_right;
		}
		while(mo_left < left){
			int t = x[mo_left];
			root->upd(t,-t);
			++mo_left;
		}
		ans[qr[i].p] = root->qry();
		//cout<<"HI"<<endl;
		//cout<<qr[i].l<<' '<<qr[i].r<<' '<<ans[qr[i].p]<<endl;
	}
	
	for(int i=0; i<q; i++) cout<<ans[i]<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...