Submission #31959

#TimeUsernameProblemLanguageResultExecution timeMemory
31959huynd2001역사적 조사 (JOI14_historical)C++14
40 / 100
4000 ms16156 KiB
/*huypheu
5 5
9 8 7 8 9
1 2
3 4
4 4
1 4
2 4
*/

#include <bits/stdc++.h>
#define int long long
using namespace std;

int le[100007],ri[100007];
int ans[100007];
map <int,int> mymap;
int it[400007];
int blo;
int a[100007],b[100007];
int v[100007];

vector <int> ve;

void update(int node,int l,int r,int x,int p)
{
	// if(node==1) cout << x << " " << p << endl;
	// cout << node << " " << l << " " << r << endl;
	if(l>r || x<l || r<x) return ;
	if(l==r)
	{
		it[node]+=p;
		// cout << node << " " << p << endl;
		return ;
	}
	int mid=(l+r)/2;
	update(node*2,l,mid,x,p);
	update(node*2+1,mid+1,r,x,p);
	it[node]=max(it[node*2],it[node*2+1]);
	return ;
}

int get(int node,int l,int r,int x,int y)
{
	if(l>r || y<l || r<x) return 0;
	if(x<=l && r<=y)
	{
		return it[node];
	}
	int mid=(l+r)/2;
	return max(get(node*2,l,mid,x,y),get(node*2+1,mid+1,r,x,y));
}

bool dcp1(int x,int y)
{
	return (a[x]<a[y]);
}

bool dcp(int x,int y)
{
	if((le[x]/blo)!=(le[y]/blo)) return ((le[x]/blo)<(le[y]/blo));
	else if(ri[x]!=ri[y]) return (ri[x]<ri[y]); else return (le[x]<le[y]);
}

signed main()
{
	// ios_base::sync_with_stdio(false);
	// cin.tie(0);
	int n,q;
	scanf("%lld %lld",&n,&q);
	// cin >> n >> q;
	blo=(int)sqrt(n);
	// cout << blo << endl;
	int m=0;
	set <int> se;
	for(int i=1;i<=n;i++)
	{
		// cin >> a[i];
		scanf("%lld",&a[i]);
		// cout << a[i] << " ";
		se.insert(a[i]);
		v[i]=i;
		// m=max(m,b[i]);
	}
	sort(v+1,v+n+1,dcp1);
	for(int i=1;i<=n;i++)
	{
		if(i==1 || a[v[i]]!=a[v[i-1]]) m++;
		b[v[i]]=m;
	}
	// for(int i=1;i<=n;i++) cout << b[i] << " " << a[i] << endl;
	// 	cout << endl;
	// for(int i=1;i<=n;i++) cout << b[i] << " ";
	// 	cout << endl;
	// cout << endl;
	for(int i=1;i<=q;i++)
	{
		scanf("%lld %lld",&le[i],&ri[i]);
		ve.push_back(i);
	}
	sort(ve.begin(),ve.end(),dcp);
	int l=le[ve[0]],r=le[ve[0]]-1;
	for(int i=0;i<ve.size();i++)
	{
		// cout << le[ve[i]] << " " << ri[ve[i]] << endl;
		while(l>le[ve[i]])
		{
			l--;
			update(1,1,m,b[l],a[l]);
		}
		while(l<le[ve[i]])
		{
			l++;
			update(1,1,m,b[l-1],-a[l-1]);
		}
		while(r<ri[ve[i]])
		{
			r++;
			update(1,1,m,b[r],a[r]);
		}
		while(r>ri[ve[i]])
		{
			r--;
			update(1,1,m,b[r+1],-a[r+1]);
		}
		ans[ve[i]]=get(1,1,m,1,m);
		// cout << it[1] << endl;
	}
	for(int i=1;i<=q;i++) printf("%lld\n",ans[i]);
		return 0;
}

Compilation message (stderr)

historic.cpp: In function 'int main()':
historic.cpp:103:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<ve.size();i++)
               ^
historic.cpp:70:26: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld %lld",&n,&q);
                          ^
historic.cpp:79:22: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld",&a[i]);
                      ^
historic.cpp:98:35: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld %lld",&le[i],&ri[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...