Cod sursa(job #1255326)

Utilizator nicolaegutaNicolae Guta nicolaeguta Data 4 noiembrie 2014 18:09:42
Problema Dtcsu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#include <ctime>
#include <cassert>
#include <iomanip>
#define Nmax 1000005

using namespace std;

struct qry
{
    int x,poz;
    bool operator < (const qry &A) const
    {
        return x>A.x;
    }
};
qry q[Nmax];
vector <qry> L[Nmax];
char a[Nmax];
int n,sol[Nmax],m,par[Nmax],st[Nmax],top;

inline void Solve()
{
    int i,j;
    vector <qry>::iterator it;
    for(i=n;i;--i)
    {
        for(it=L[i].begin();it!=L[i].end();++it)
        {
            if(it->x>par[i])
            {
                L[i-1].push_back(*it);
            }
            else
            {
                sol[it->poz]+=i-par[i]+1;
                if(par[i]-1)
                    L[par[i]-1].push_back(*it);
            }
        }
        L[i].clear();
    }
}

inline void Par()
{
    int i;
    for(i=n;i;--i)
        if(a[i]=='(')
        {
            if(top)
                par[st[top--]]=i;
        }
        else
            st[++top]=i;
}

int main()
{
    int i,x,y;
    freopen ("dtcsu.in","r",stdin);
    freopen ("dtcsu.out","w",stdout);
    scanf("%s", (a+1));
    n=strlen(a+1);
    Par();
    cin>>m;
    for(i=1;i<=m;++i)
    {
        cin>>x>>y;
        q[i].x=x; q[i].poz=i;
        L[y].push_back(q[i]);
    }
    Solve();
    for(i=1;i<=m;++i) cout<<sol[i]<<"\n";
    return 0;
}