Cod sursa(job #2210043)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 5 iunie 2018 15:42:24
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <cstdio>
#include <algorithm>

using namespace std;


const int Dim = 100001,Inf = 0x3f3f3f3f;
int TreeM[Dim * 4],n,m,Treem[Dim * 4],S[Dim],mi,ma;

void Get(int &x);
void UpdateM(int node, int le,int ri,int pos ,int val) ;
void Updatem(int node, int le,int ri,int pos ,int val);
void Query(int node , int le , int ri , int a , int b);

int  main() {
		
	freopen("sequencequery.in","r",stdin);
	freopen("sequencequery.out","w",stdout);
	Get(n); Get(m);
	int x,y;
	for ( int i = 1; i <= n; ++i) {
		Get(x);
		
		S[i] = S[i-1] + x;
	}
	for ( int i = 1; i <= n; ++i) {
		UpdateM(1,1,n,i,S[i]);
		Updatem(1,1,n,i,S[i]);
		}
	for ( int i = 1; i <= m; ++i) {
		Get(x),Get(y);
		mi = Inf;
		ma = -Inf;
		if ( x != y) {
			Query(1,1,n,x,y);
			printf("%d\n",ma-mi); 	
			}
		else
			printf("%d\n",S[x] - S[x-1]); 
		}
		
}


void UpdateM(int node, int le,int ri,int pos ,int val) {
	if(le == ri) {
		TreeM[node] = val;
		return ;
	}
	int mj = (le + ri) / 2;
	if( pos <= mj)
		UpdateM(node * 2, le, mj , pos , val);
	else
		UpdateM(node * 2 + 1 , mj + 1 , ri , pos , val);
	TreeM[node]  = max( TreeM[node * 2]  , TreeM[node * 2 + 1] );
}

void Updatem(int node, int le,int ri,int pos ,int val) {
	if(le == ri) {
		Treem[node] = val;
		return ;
	}
	int mj = (le + ri) / 2;
	if( pos <= mj)
		Updatem(node * 2, le, mj , pos , val);
	else
		Updatem(node * 2 + 1 , mj + 1 , ri , pos , val);
	Treem[node]  = min( Treem[node * 2]  , Treem[node * 2 + 1] );
}

void Query(int node , int le , int ri , int a , int b){
    if(a <= le and b >= ri) {
        ma = max( TreeM[node], ma);
        mi = min(Treem[node],mi);
    return ;
    }
	int mj = (le + ri) / 2;
	if(a <= mj)
		Query(2 * node, le , mj, a , b);
	if(b > mj)
		Query(2 * node + 1, mj + 1 , ri ,a , b);
}
const int Lim = 10000001;
int u =  Lim - 1;
char s[Lim];

void Next () {
    if (++u == Lim)
        std::fread(s, 1, Lim, stdin), u = 0;
}

void Get (int &x) {
 bool semn = false;
    for (; s[u] < '0' || s[u] > '9'; Next());
    if ( s[u-1] == '-')
		semn = true;
    for (x = 0; s[u] >= '0' && s[u] <= '9'; Next())
		   x = x * 10 + s[u] - '0';
		
if( semn == true)
	x*=-1;
}