Wednesday, October 31, 2012

Range Minimum Query (RMQ)

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
#define siz 1000005
int a[siz],b[siz];
int n,m,sqrtN;
char as[siz];
void reset(){
    for(int i=0;i<=sqrtN;i++){
        b[i]=0;
    }
}
void search(int x, int y){
    int sum=0;
    for(int i=x;i<=y;i++){
        if(i+sqrtN<=y&&(i+sqrtN)%sqrtN==0){
            sum+=b[i/sqrtN];
            i+=(sqrtN-1);
        }
        else sum+=a[i];
    }
    printf("%d\n",sum);
}
int main()
{
    int x,y,q;
    //freopen("input.txt","r",stdin);
    scanf("%d",&n);
    for(int t=0;t<n;t++){
        scanf("%d",&m);
        sqrtN=(int)sqrt((double)m);
        reset();
        for(int i=0;i<m;i++){
            scanf("%d",&a[i]);
            b[i/sqrtN]+=a[i];
        }
        scanf("%d",&q);
        for(int i=0;i<q;i++){
            scanf("%s",&as);
            if(strcmp(as,"Inquire")==0){
                scanf("%d%d",&x,&y);
                search(x-1,y-1);
            }
            else if(strcmp(as,"Add")==0){
                scanf("%d%d",&x,&y);
                x-=1;
                a[x]+=y;
                b[x/sqrtN]+=y;
            }
            else if(strcmp(as,"Delete")==0){
                scanf("%d%d",&x,&y);
                x-=1;
                if(a[x]<y){
                    b[x/sqrtN]-=a[x];
                    a[x]=0;
                }
                else{
                    a[x]-=y;
                    b[x/sqrtN]-=y;
                }
            }
        }
    }
    return 0;
}

No comments:

Post a Comment